使用spring mvc提交/绑定部分对象

时间:2010-09-25 16:13:14

标签: java spring-mvc

Spring MVC绑定机制很强大,但我现在面临一个小问题,我想知道如何解决:

  • User JPA实体,也用于绑定和验证(即遍及所有层)
  • “编辑个人资料”页面,不应该更改密码或其他一些实体属性

我能想到的两种方式:

  1. 使用相同的对象

    • 使用@InitBinder配置不允许的属性列表
    • 获取目标用户(按ID)
    • 然后使用反射实用程序(BeanUtils)将提交的对象复制到目标对象,但忽略null值 - 即未提交的字段
  2. 引入具有所需字段子集的新对象,并使用BeanUtils.copyProperties(..)将其合并到实体。

  3. 替代?

3 个答案:

答案 0 :(得分:2)

我发现只要你的网络模型在功能上开始偏离业务层,最好使用视图层对象(模型对象)来收集或显示数据

实体:

public class com.myapp.domain.UserEntity {

}

模型对象:

public class com.myapp.somesite.web.SomeSiteUserModel {

   public static SomeSiteUserModel from(UserEntity userEntity) {
      ... initialize model ...
   }

   public UserEntity getModelObject() {
      ... get entity back ... 
   }

}

现在所有基于视图的操作都可以将处理交给内部模型对象,如果这是有意义的,否则它可以自己定制它们。当然,问题在于你必须重新编写实体所需的所有getter和setter(这是我必须处理的问题,这很烦人),遗憾的是这有点像Java语言问题< / p>

答案 1 :(得分:1)

我刚刚查看了我工作过的最后一个Spring项目中的两个,并且在这两个地方采取了以下方法:

在表单的JSP页面中,更改密码字段的名称与User bean中的密码字段名称不匹配,因此它不会映射到bean。然后在onSubmit方法中单独检查是否已提交新密码,如果已提交,则明确反映更改。

Поздрави, Vassil

答案 2 :(得分:0)

您可以先从数据库中读取对象,然后绑定请求。您可以在FuWeSta-Sample找到一个示例。

它使用helper-bean,必须由Spring初始化。