【问题标题】:Spring @RequestBody and default valuesSpring @RequestBody 和默认值
【发布时间】:2013-03-05 00:33:32
【问题描述】:

当接收到作为@ResponseBody 参数的详细信息时,Spring 会创建一个正确类型的新对象(例如public void createUser(@RequestBody User user)。我将数据作为 JSON 发送到服务器,Spring 会按照指定创建新的用户对象。

我的问题是,无论如何让 Spring 忽略我拥有的自动生成的字段(如 createDate 等)。因此,例如,如果我只传入{"username":"sam"} 而没有其他任何内容,我想要一个只填充用户名字段的用户对象,而没有其他字段(即使这是无效的)。

我问这个的原因是因为我的用户从另一个我无法触及的对象继承了一些默认的自动生成属性,并且我需要一个对象,除了来自请求的字段之外,所有字段都为空。 更新:然后我可以将新创建​​的对象与 JpaRepository 中的对象合并(忽略空值)。

谢谢你:-)

【问题讨论】:

  • 您可能需要覆盖这些字段的 getter 并添加注解 @JsonIgnore
  • 听起来像 createDate 等其他字段是在实例化时设置的?没有办法解决这个问题。我能想到的唯一方法是在 User 对象的默认构造函数中将所有值设置为 Null。
  • 谢谢ninn:我认为你是对的。我将不得不解决删除所有默认值的问题,并在新对象最初持久保存到数据库之前调用某种伪构造函数。请列出您的答案,以便我接受 :) .. 谢谢 Arun:如果我 JsonIgnore 这些字段,它们将根本无法更新。我希望他们仅在该特定字段的 JSON 数据进入时更新。

标签: java spring spring-mvc


【解决方案1】:

它确实有办法做到这一点。例如:@initBinder or convertService,但它会更复杂,而且我也不知道执行该代码的确切实现。而最简单的方法是创建一个新类,可以称为:TmpUser,并且只有一个字段:userName,您使用该类接受请求数据,并将数据复制到用户,然后它可以满足您的要求.您可以使用Spring utils. BeanUtils.copyProperties() 进行复制。

【讨论】:

  • 谢谢拉克希米。传入的数据可能有多个字段或多个字段之一,而不仅仅是用户名。我不想复制空值。另外,关于如何使用 BeanUtils 对对象进行深拷贝有什么想法吗?
  • 如果你使用 BeanUtils.copyProperties(User,TmpUser);并且它会将TmpUser中的字段值复制到User中,并且由于User中的某些字段不包含在TmpUser中,所以在复制之后这部分字段值将保留为默认值,即为null。
【解决方案2】:

如果你返回一个 User 对象,默认情况下所有字段都会自动包含在内,你不能改变它。但你可以只返回一个填充了 uername 的 HashMap。

@ResponseBody public Map createUser(@RequestBody User user) {
    ...
    Map userCreated = new HashMap();
    userCreated.put("username", user.getUsername());
    return userCreated;
}

另外,您可以定义并创建一个新的 UserForm 对象来执行您期望返回的内容,如下所示。

public class UserForm{

    private String username;

    public UserForm(User user){
        this.username = user.getUsername();
    }

    public void setUsername(String username){
        this.username = username;
    }

    public String getUsername(){
        return this.username;    
    }
}

@ResponseBody public UserForm createUser(@RequestBody User user) {
    ...

    return new UserForm( user );
} 

希望它会有所帮助。

【讨论】:

  • 谢谢亨利。如果我像您在第一个示例中建议的那样实现 Map,那么将地图中的值放入数据库中现有 User 对象的最佳方法是什么,只更新传入的字段?
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2018-10-07
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多