2013-03-05 2893 views
1

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

我的问题是,有没有办法让Spring忽略自动生成的字段(比如createDate等)。所以,如果我例如通过{"username":"sam"}而没有别的, D类似于其他领域(即使是无效的)的用户对象只填充了用户名字段,并没有。

的原因,我问这个是因为我的用户继承某些默认autoge来自另一个我无法触及的对象的特性属性,我需要有一个对象除了来自请求的字段外,其它所有字段都为null。 更新:然后我可以在JpaRepository(忽略空值)的对象合并新创建的对象。

谢谢:-)

+0

您可能需要重写这些字段的获取方法并添加注释'@ JsonIgnore' – 2013-03-05 00:39:16

+0

查看http://stackoverflow.com/questions/3921736/parsing-json-into-java-objects-in-spring- mvc – iMysak 2013-03-05 00:40:34

+0

听起来像createDate等其他字段是在实例化时设置的?这是没有办法的。我可以考虑的唯一方法是将所有值设置为Null在User对象的默认构造函数中。 – ninnemannk 2013-03-05 20:58:45

回答

0

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

+0

谢谢Lakshmi。进入的数据可能有多个字段或多个字段中的一个,而不仅仅是用户名。我不想复制null值。 另外,有关如何使用BeanUtils对对象进行深层复制的任何想法? – SamEsla 2013-03-06 22:35:28

+0

如果使用BeanUtils.copyProperties(User,TmpUser);它会在TmpUser复制领域衣被合计到用户,而且由于用户某些领域不包括在TmpUser,所以副本字段值的那些部分将被保存为默认,这将是无效后。 – OQJF 2013-03-07 00:37:59

0

如果返回一个User对象,所有领域都包括全自动默认情况下,不要去碰改变它。但是你可以返回一个带填充名称的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); 
} 

希望它会有所帮助。

+0

谢谢亨利。如果我像第一个示例中所建议的那样实现一个Map,那么将地图中的值放入数据库中现有的User对象的最佳方法是什么?只更新进入的字段? – SamEsla 2013-03-06 22:37:36