Spring @RequestBody和默认值

4

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

我的问题是,是否有办法让Spring忽略我自动生成的字段(例如createDate等)。因此,例如,如果我只传递{"username":"sam"}并且没有其他内容,我希望用户对象仅填充了用户名字段,而没有其他字段(即使那是无效的)。

我之所以这样问,是因为我的User继承了另一个对象生成的一些默认属性,但我不能改变它。我需要一个所有字段都为空,除了来自请求的字段的对象。更新:然后,我可以将新创建的对象与JpaRepository中的对象合并(忽略null值)。

谢谢 :-)


你可能需要重写这些字段的getter方法并添加注解@JsonIgnore - Arun P Johny
请查看https://dev59.com/aW865IYBdhLWcg3wOb9h,该内容与Java对象在Spring MVC中解析JSON相关。 - iMysak
听起来像是其他字段,比如createDate在实例化时就被设置了?这是无法避免的。我能想到的唯一解决方法是在你的用户对象的默认构造函数中将所有值都设置为Null。 - ninnemannk
谢谢ninn:我认为你是对的。我将不得不放弃所有默认值,并有某种伪构造函数,在新对象最初持久化到数据库之前调用它。请列出您的答案,以便我可以接受它 :)谢谢Arun:如果我JsonIgnore字段,它们将根本无法更新。我希望它们只在针对特定字段的JSON数据到来时更新。 - Sam
2个回答

0

确实有办法做到这一点。例如:@initBinder或convertService,但这样会更复杂,而且我也不知道具体的实现方式来编写这段代码。最简单的方法是创建一个新的类,可以称为:TmpUser,只有一个字段:userName,你可以使用这个类来接收请求数据,并将数据复制到User对象中,这样就可以满足你的要求了。你可以使用Spring utils. BeanUtils.copyProperties()进行复制操作。


谢谢Lakshmi。传入的数据可能有多个字段或其中之一,而不仅仅是用户名。我不想复制空值。 此外,您知道如何使用BeanUtils进行对象的深度复制吗? - Sam
如果您使用BeanUtils.copyProperties(User, TmpUser);,它将复制TmpUser中的字段值到User中,因为User中的某些字段未包含在TmpUser中,所以在复制后,这些字段值的那部分将保持默认值,即null。 - OQJF

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

希望这能有所帮助。


谢谢Henry。如果我按照你在第一个示例中建议的实现Map,那么将Map中的值放入现有的数据库用户对象中,只更新传入的字段,最好的方法是什么? - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接