Spring @RequestBody和默认值

时间:2013-03-05 00:33:32

标签: java spring spring-mvc

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

我的问题是,无论如何让Spring忽略我自己生成的字段(比如createDate等)。所以,例如,如果我传入{"username":"sam"}而没有别的,我想要一个只填充用户名字段的用户对象,而不是其他任何字段(即使它是无效的)。

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

谢谢: - )

2 个答案:

答案 0 :(得分:0)

如果您返回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 );
} 

希望它会有所帮助。

答案 1 :(得分:0)

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