Java Spring4枚举为控制器参数
以后编辑 我所描述的案例运作正常。当我在控制器的方法上有类似的内容时,就会出现问题:Java Spring4枚举为控制器参数,java,spring,enums,Java,Spring,Enums,以后编辑 我所描述的案例运作正常。当我在控制器的方法上有类似的内容时,就会出现问题: @RestController public class MyController { @RequestMapping(...) public void myMethod(@RequestBody MyForm myform) { ... } } public class MyForm { private X x; //setters and getters } 原因 给定Request
@RestController
public class MyController {
@RequestMapping(...)
public void myMethod(@RequestBody MyForm myform) { ... }
}
public class MyForm {
private X x;
//setters and getters
}
原因 给定RequestBody,Spring将使用HttpMessageConverter将请求体反序列化为给定类型的实例。在本例中,它将为JSON使用MappingJackson2HttpMessageConverter。此转换器根本不涉及您的PropertyEditor支持 还有别的选择吗?在这种情况下,我需要使用
@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]
有什么建议吗?尝试将@RequestVariable更改为@RequestParameter 我将更改setAsText方法行,如下所示:
@Override
public void setAsText(String text) {
try {
String upperText = text.toUpperCase();
X xResult = X.valueOf(upperText);
setValue(xResult);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Custom binding failed. Input type: String. Expected type of value to be set: X", e);
}
}
你的要求到底是什么样的?