我在JSP中有一个表单,要提交给控制器。现在,表单的一个属性是枚举,但我不能让它工作。
public class UploadFormBean {
private Type type;
public enum Type {
A ("abc"),
B ("xyz"),
C ("pqr");
private final String str;
private Type(final String str) {
this.str = str;
}
@Override
public String toString() {
return str;
}
}
public Type getType() {
return type;
}
public void setType(final String type) {
for (Type s: Type.values()) {
if (s.toString().equalsIgnoreCase(type)) {
this.type = s;
}
}
}
}
控制器:
public ModelAndView execute(final HttpServletRequest request, @ModelAttribute final UploadFormBean uploadFormBean) {
//some code.
Type t = uploadFormBean.getType(); //t is null.
//some more code.
}
JSP:
<input type="hidden" name="type" value="abc">
我错过了什么。如果需要任何信息,请告诉我。感谢您的帮助。
答案 0 :(得分:0)
您无法直接映射Enum
,将表单bean类型更改为
private String type;
它会起作用
答案 1 :(得分:0)
问题是默认的Spring MVC属性编辑器无法确定如何将HTTP请求中提交的abc
映射到Type.A
。它对枚举的默认行为是将字符串值转换为枚举。由于找不到名为abc
的枚举值,因此使用null
进行终止。
您可以通过编写自己的PropertyEditor
来解决此问题。
public class TypeEditor extends java.beans.PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(text != null) {
text = text.trim();
if(text.equalsIgnoreCase("abc")) {
setValue(Type.A);
}
else if(text.equalsIgnoreCase("xyz")) {
setValue(Type.B);
}
else if(text.equalsIgnoreCase("pqr")) {
setValue(Type.C);
}
}
}
}
最好在枚举类Type
中创建一个方法,以便从Type
获取java.lang.String
值。之后,属性编辑器代码将得到简化,对枚举值的任何更改都将本地化为Type
类。
然后,将此编辑器添加到控制器类中的Web绑定器。
@Controller
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Type.class, new TypeEditor());
}
}