【问题标题】:Is Spring MVC using setter methods to set the properties of ModelAttribute objects?Spring MVC 是否使用 setter 方法来设置 ModelAttribute 对象的属性?
【发布时间】:2012-02-02 02:52:30
【问题描述】:

Spring MVC 是否使用 getter 和 setter 来设置 ModelAttribute 对象的值?你能引用我的消息来源吗?如果没有,我们如何强制 Spring MVC 使用 setter 来设置模型对象的属性?

谢谢。

【问题讨论】:

  • 您提出的问题没有意义。 ModelAttribute 是一个注解,因此在运行时不应“获取”或“设置”@ModelAttribute 的实例。请澄清您的问题。

标签: java spring spring-mvc


【解决方案1】:

我不知道这是否真的回答了这个问题,但我在文档中找到了这句话:

命令或表单对象将请求参数绑定到 bean 属性(通过设置器)或直接绑定到字段,具有可自定义的类型转换,具体取决于 @InitBinder 方法和/或 HandlerAdapter 配置。 ... ModelAttribute 注解可用于方法参数以自定义使用的模型属性名称。

这似乎意味着如果可用,将使用 setter,直接更新字段作为后备。

但如果你想要一个明确的答案,请查看源代码。

【讨论】:

  • 你说得对,Spring MVC 确实在使用 setter,但并非总是如此。假设我有 并且 getMyList() 是一个方法,它返回一个新的 list 实例,其中包含来自 set 属性的所有项目。一切都失败了,因为 Spring 正在使用 getter 填充我列表中的项目。我期待 spring 不使用 getter 将项目放在我的列表中,而是初始化它自己的列表并使用 setter 将其设置回我的表单上。这就像我给 Spring 一个新的集合中的项目列表,spring 将一些东西放在那个列表中,但它没有将它设置回来。真是个陷阱。
  • @supertonsky - 你并不完全有道理。如何使用“getter”来填充内容?
  • 不,是 Spring 使用 getter 获取列表以在其中插入项目。我提到它是为了让您了解它失败的原因,因为它不返回实际属性,而只是返回一个包含来自 Set 属性的项目的新列表。
  • 就像这样 getMyList(){ return new ArrayList(this.mySet) }; setMyList(列表列表){ this.mySet.addAll(列表); }
  • 鉴于,如果 Spring 使用我的 getMyList() 来填充项目,那么它变得毫无意义,因为该列表是一个新实例。 Spring 必须将其重新设置,否则将毫无意义,没有任何内容引用该新列表。我不想在我的 POJO 上创建一个临时列表实例变量来完成这项工作。
【解决方案2】:

我也遇到这个问题,情况如下:

代码sn-p:

Product.java

public class Product {

    private String name;
    private String imageStr;
    private List<ProdutImage> productImageList;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<ProductImage> getProductImageList() {
        return this.productImageList;
    }

    public void setProductImageList(List<ProductImage> productImageList) {
        this.productImageList = productImageList;
        if (productImageList != null) {
            this.imageStr = [...]// convert list to json string
        }
    }

}

没有直接设置“imageStr”,而是基于图片列表字段,jsp页面点赞:

 <form>
      <input type="text" name="product.name"/>
      <input type="text" name="product.productImageList[0]"/>
      <input type="text" name="product.productImageList[1]"/>
      <input type="text" name="product.productImageList[2]"/>
   </form>

提交表单时,“name”和“productImageList”都可以填充成功,有一点不同,我在“setName”和“setProductImageList”都设置了断点,可以发现“setName”是调用,但不是“setProductImageList”,因为这样,“imageStr”为空。

【讨论】:

    猜你喜欢
    • 2016-11-18
    • 2014-09-20
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多