2013-05-28 2 views
0

Я тестирую аннотацию @InitBinder, поэтому у меня есть объекты String, преобразованные в соответствующие объекты Enum во время веб-запросов.метод initBinder не вызывается для преобразования из String в Enum

Я создал следующие простые Enum:

SampleEnum.java

public enum SampleEnum { 
    ONE, 
    TWO, 
    THREE, 
    FOUR, 
    FIVE; 
} 

Затем я создал редактор простирающуюся PropertyEditorSupport быть вызван из @InitBinder кода:

EnumPropertyEditor. java

@SuppressWarnings("rawtypes") 
public class EnumPropertyEditor extends PropertyEditorSupport { 
    private Class clazz; 

    public EnumPropertyEditor(Class clazz) { 
     this.clazz = clazz; 
    } 

    @Override 
    public String getAsText() { 
     return (getValue() == null ? "" : ((Enum) getValue()).name()); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void setAsText(String text) { 
     Enum e = Enum.valueOf(clazz, text); 
     setValue(e); 
    } 
} 

Затем в моем контроллере я добавил @InitBinder и простое отображение запроса:

контроллера

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(SampleEnum.class, new EnumPropertyEditor(SampleEnum.class)); 
} 

@RequestMapping(method = POST, value = "/postSampleEnum") 
@ResponseBody 
public SampleEnum postSampleEnum(@RequestBody SampleEnum sampleEnum) { 
    return sampleEnum; 
} 

Из моего понимания, запрос этого метода контроллера должен попытаться преобразовать строку значение в объект SampleEnum. Тем не менее, никакие точки останова не попадают ни в initBinder, ни в метод сопоставления запросов, ни в любой из методов в EnumPropertyEditor.

Я тестирую RESTClient в FireFox и попытался отправить тело запроса «ТРИ», которое я ожидал бы работать. Вместо этого я получаю ошибку 415, независимо от того, что находится в теле запроса. (Сервер отказался от этого запроса, потому что объект запроса находится в формате, не поддерживаемом запрошенным ресурсом для запрошенного метода().)

Если я изменяю сопоставление запроса, чтобы взять строку, а не SampleEnum, postSampleEnum вызывается и не использует настраиваемый редактор (как и ожидалось).

Не хватает ли чего-нибудь, что позволяет вызывать код пользовательского редактора? Каков наилучший способ продолжить отладку?

+0

Я не думаю, что вы можете использовать 'InitBinder' с' RequestBody'. Если вы можете переключиться на «RequestParam» или даже «ModelAttribute», я думаю, что это сработает. – GriffeyDog

ответ

0

Прежде всего, я забыл добавить тип содержимого приложения/json в заголовок запроса в RESTClient. > _ <

whoops

Однако я заметил, что выполнение кода до сих пор не проходит через редактора свойств. Как сказал GriffeyDog, похоже, что код выполняется только в том случае, если я переключаюсь на RequestParam или ModelAttribute.