Java Spring@RequestBody和默认值

Java Spring@RequestBody和默认值,java,spring,spring-mvc,Java,Spring,Spring Mvc,Spring在接收作为@ResponseBy参数的详细信息时创建了一个正确类型的新对象(例如,public void createUser(@RequestBody User User)。我将数据作为JSON发送到服务器,Spring将按照指定创建新的用户对象 我的问题是,是否有办法让Spring忽略我自动生成的字段(如createDate等)。因此,如果我传入{“username”:“sam”}而不传入其他内容,我希望用户对象只填充username字段,而不填充任何其他字段(即使这是无效的)

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

我的问题是,是否有办法让Spring忽略我自动生成的字段(如createDate等)。因此,如果我传入
{“username”:“sam”}
而不传入其他内容,我希望用户对象只填充username字段,而不填充任何其他字段(即使这是无效的)

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


谢谢:-)

如果返回用户对象,默认情况下会自动包含所有字段,您无法更改它。但是您可以返回一个填充了用户名的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 );
} 

希望它能有所帮助。

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

您可能必须覆盖这些字段的getter并添加注释
@JsonIgnore
看起来,其他字段(如createDate)似乎是在实例化时设置的?这是没有办法的。我能想到的唯一办法是在用户对象的默认构造函数中将所有值都设置为Null。我将不得不决定删除所有默认值,并在新对象最初持久化到数据库之前调用某种伪构造函数。请列出你的答案,以便我能接受:)。。谢谢阿伦:如果我忽略了这些字段,它们将根本不可更新。我希望他们只在JSON数据进入该特定字段时更新。谢谢Lakshmi。输入的数据可以有多个字段或多个字段中的一个,而不仅仅是用户名。我不想复制空值。另外,如果您使用BeanUtils.copyProperties(User,TmpUser),您知道如何使用BeanUtils对对象进行深度复制吗;它会将TmpUser中的字段值复制到用户,因为用户中的某些字段不包含在TmpUser中,所以在复制之后,这些字段值的部分将保留为默认值,该值将为空。谢谢亨利。如果我实现了第一个示例中建议的映射,那么将映射中的值放入数据库中现有用户对象的最佳方式是什么,只更新传入的字段?