Позже Редактироватьпружина 4 перечислений как контроллер параметров
Случай я описал работает правильно. Проблема возникает, когда у меня есть что-то вроде этого на методе моего контроллера:
@RestController
public class MyController {
@RequestMapping(...)
public void myMethod(@RequestBody MyForm myform) { ... }
}
public class MyForm {
private X x;
//setters and getters
}
Причина
Учитывая RequestBody, Spring будет использовать HttpMessageConverter десериализации ваше тело запроса в экземпляр ваш тип. В этом случае он будет использовать MappingJackson2HttpMessageConverter для JSON. Этот конвертер вообще не связан с PropertyEditorSupport.
Любые альтернативы? Мне нужно использовать @RequestBody
в этом случае или найти способ поставить X
в myform
.
Я хочу поместить перечисление в качестве параметров внутри метода контроллера REST.
Это то, что у меня есть до сих пор.
Перечисление:
public enum X {
A("A"),B("B"),C("C");
... methods and constructors ...
}
Контроллер:
@RestController
public class MyController {
@RequestMapping(...)
public void myMethod(@PathVariable("x") X x) { ... }
}
Конфигурация:
@ControllerAdvice
public class GlobalControllerConfig {
@InitBinder
public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(X.class, new XPropertyEditor());
}
}
Свойство редактор:
public class XPropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) {
try {
setValue(X.findByName(text));
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Custom binding failed. Input type: String. Expected type of value to be set: X", e);
}
}
@Override
public String getAsText() {
return ((X)getValue()).getName();
}
}
Я поставил точку останова в своем @ControllerAdvice
, и он проходит через это связывание каждый раз, когда запрос делается на любой из моих контроллеров. Это заставляет меня думать, что привязка правильная.
Когда я отправить запрос на мой метод, я получаю это, и я не понимаю, почему:
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not construct instance of ...X from String value 'A': value not one of declared Enum instance names: [A, B, C]
Есть предложения?
Как ваш запрос выглядеть как именно? – jannis