使用Spring MVC提交/绑定部分对象


问题内容

Spring MVC绑定机制非常强大,但是我现在面临着一个琐碎的问题,我想知道如何解决:

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

我可以想到两种方法:

  1. 使用同一对象

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

备择方案?


问题答案:

我发现,只要您的Web模型在功能上与业务层开始有所不同,最好使用视图层对象(模型对象)来收集或显示数据

实体:

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语言问题