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

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

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

我能想到的两种方式:

  1. 使用相同的对象

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

备择方案?

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

实体:

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

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

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

Поздрави,Vassil

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

它使用一个必须由Spring初始化的辅助bean 。