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

Java 使用spring mvc提交/绑定部分对象,java,spring-mvc,Java,Spring Mvc,Spring MVC绑定机制功能强大,但我现在面临一个小问题,我想知道如何解决: UserJPA实体,也用于绑定和验证(即贯穿所有层) “编辑配置文件”页面,不应更改密码或某些其他实体属性 我可以想到两种方法: 使用同一对象 使用@InitBinder配置不允许的属性列表 获取目标用户(按id) 然后使用反射实用程序(BeanUtils)将提交的对象复制到目标对象,但忽略null值-即未提交的字段 引入一个具有所需字段子集的新对象,并使用BeanUtils.copyProperties(

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

  • User
    JPA实体,也用于绑定和验证(即贯穿所有层)
  • “编辑配置文件”页面,不应更改密码或某些其他实体属性
我可以想到两种方法:

  • 使用同一对象

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


  • 备选方案?

    我刚刚检查了我参与的两个春季项目,在这两个地方都采取了以下方法:

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

    Пззаа,
    Vassil

    我发现,一旦您的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语言问题,您可以先从数据库读取对象,然后绑定请求。你可以在网站上找到一个例子


    它使用了一个必须由Spring初始化的属性。

    谢谢,密码更改将通过一个简单的
    请求来处理。gatPerameter(..)
    ,但是
    用户的属性还有很多,不需要提交/绑定。在这种情况下,我认为您有两个选择:1。以表单的形式输出所有属性的值(可能对某些属性使用隐藏字段)。2.使用InitBinder——毕竟这就是它们的用途。使用隐藏字段意味着用户可以为这些字段提交不同的值,这不是您想要的。这意味着用户输入完整性已被破坏,并通过验证处理为无效。隐藏字段实际上是在一堆框架中实现的“标准”黑客。不过,我仍然更喜欢init binder解决方案。我最终以这种方式实现了它,只是需要注意的是,对于“初始化模型”,我使用了
    BeanUtils.copyProperties(…)
    非常好,我以前也需要类似的东西,但最后总是手动完成,谢谢!