我的控制器注释为
public ModelAndView execute(final HttpServletRequest request, @ModelAttribute final UploadFormBean uploadFormBean) {
//some code.
Type t = uploadFormBean.getType(); //t is null.
//some more code.
}
UploadFormBean
定义为:
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;
}
}
}
}
为什么@mMdelAttribute
无法在type
函数中设置t
变量execute
为空?
我错过了什么?另外,请解释@ModelAttribute
如何将数据成员从http请求绑定到java bean。
注意:如果type
为String
且setType定义为:
void setType(final String type) {
this.type = type;
}
JSP:
<input type="hidden" name="type" value="abc">
<input type="hidden" name="type" value="xyz">
答案 0 :(得分:0)
1)为什么@mMdelAttribute不能设置类型变量(t在执行函数中为空)?
因为对于绑定,它会期望像下面的一个setter。
public void setType(final Type type) {
this.type = type) ;
}
但是这不会像弹簧形式那样作为路径值,因为枚举不会有 公共建设者。
更好的方法是将你的bean重新考虑在下面
public class UploadFormBean {
private String 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 String getType() {
return type;
}
public void setType(String type) {
for (Type s: Type.values()) {
if (s.toString().equalsIgnoreCase(type)) {
this.type = s.name();
}
}
}
}