@ModelAttribute注释无法填充bean变量

时间:2015-02-06 02:55:40

标签: java spring spring-mvc

我的控制器注释为

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。

注意:如果typeString且setType定义为:

,则此方法正常
void setType(final String type) {
    this.type = type;
}

JSP:

<input type="hidden" name="type" value="abc">
<input type="hidden" name="type" value="xyz">

1 个答案:

答案 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();
            }
        }

    }
}