2014-09-20 94 views
0

我需要将收到的json对象转换为自定义实体类型Product并进行验证。之后我需要坚持下去。有没有一种方法可以使用批注和Spring框架支持REST风格的Web服务,只用注释和控制器的方法签名来完成它?有没有办法将自定义对象转换为POST JSON后在方法签名中进行验证?

控制器

@RestController 
@RequestMapping("/") 
public class pController { 

     @RequestMapping(value = "/addProduct", method = RequestMethod.POST) 
     @ResponseBody 
     public String addProduct(Model model, @Valid Product product , 
              BindingResult result){ 
       // somehow get converted json as Product, should be already validated 
      } 

实体

@Table(name = "product") 
@Entity 
public class Product implements Serializable { 
    @Id 
    @Column(name = "product") 
    @GeneratedValue 
    private int product; 
    @Column(name = "name") 
    @Basic 
    @NotEmpty 
    private String name; 
     ... 
    } 
+0

你想要在控制器处理程序方法体中保留'Product'实例的东西吗? – 2014-09-20 17:51:42

+0

我已经有服务来坚持产品。我只是想要验证的产品存储。 – 2014-09-20 18:17:38

+0

啊,然后看下面的答案。 '@ RequestBody'来反序列化JSON(和其他类型)。 – 2014-09-20 18:18:23

回答

1

您可以轻松地做到这一点,如果你使用Spring 3.1或更高版本。只要把consumes属性,在@RequestMapping和你Product参数之前提供@RequestBody,如下图所示:

@RequestMapping(value = "/addProduct", method = RequestMethod.POST, consumes="application/json") 
    @ResponseBody 
    public String addProduct(Model model, @RequestBody Product product , 
             BindingResult result){ 
      // you get your desired product object! 
    } 

最重要的是,把杰克逊作为项目的依赖。

  • 基于XML的配置你需要<mvc:annotation-driven />
  • 基于Java的配置只是把@EnableWebMvc在你的配置类

就是这样!

编辑:

是的,你@RequestBody前使用@Valid注释,因为@RequestBody简单地将JSON转换成你预期的Class对象,它不验证对你的Hibernate验证的配置对象。为此,您必须将@Valid注释与@RequestBody一起使用。

+0

'@ RequestBody'之前必须有'@ Valid'吗?为什么? – 2014-09-20 18:19:51

+0

@RCola,我编辑了我的答案以方便您的问题,请看看。 – 2014-09-20 18:30:55

相关问题