Я тестирую аннотацию @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
вызывается и не использует настраиваемый редактор (как и ожидалось).
Не хватает ли чего-нибудь, что позволяет вызывать код пользовательского редактора? Каков наилучший способ продолжить отладку?
Я не думаю, что вы можете использовать 'InitBinder' с' RequestBody'. Если вы можете переключиться на «RequestParam» или даже «ModelAttribute», я думаю, что это сработает. – GriffeyDog