2011-10-11 77 views
1

我想使用域对象作为@RequestBody。我的域对象是不可变的对象,所以它们没有任何setter方法。它的应用程序/ json请求,我正在使用杰克逊消息转换器。Spring 3 MVC - 使用域对象作为@RequestBody

@RequestMapping(value="/user", method=RequestMethod.POST) 
@ResponseStatus(HttpStatus.NO_CONTENT) 
public @ResponseBody void createUser(@RequestBody User user) { 
    .......... 
} 

因为我没有我的用户对象的内部setter方法,当我做一个POST请求到“/用户”,我从MappingJacksonHttpMessageConverter得到UnrecognizedPropertyException。春天有没有办法可以使用用户对象的静态工厂方法(或构造函数)而不是setter来分配数据。

回答

0

我认为这取决于您的JSON解析器。我知道GSON [1]在领域(而不是获得者/定位者)上工作,所以你可能会有更好的运气。我相信你必须编写自己的消息转换器。

[1] http://code.google.com/p/google-gson/

+0

另外:作为版本1.2,杰克逊允许使用的“创建者”的方法(构造器和静态工厂方法),这意味着它可以省略设置器方法,如果数据是通过构造要传递(HTTP: //wiki.fasterxml.com/JacksonFAQ#Data_Binding.2C_general)。我想知道MappingJacksonHttpMessageConverter如何实现它。 – Chandra

2

,我发现自己的答案。使用@JsonCreator。这是一个例子。你也可以在静态工厂方法中使用它。

@JsonCreator 
public NonDefaultBean(@JsonProperty("name") String name, @JsonProperty("age") int age) 
{ 
    this.name = name; 
    this.age = age; 
} 
+0

很好的答案,正是我所期待的。 –