2016-03-23 55 views
0

我想在使用spring jackson將它轉換爲POJO之前驗證控制器中的傳入json對象。在將它轉換爲POJO之前驗證Json對象 - 使用@requestBody

我的控制器:

@RequestMapping(value = "/createContact" , method = RequestMethod.POST , consumes = MediaType.APPLICATION_JSON_VALUE , produces = MediaType.APPLICATION_JSON_VALUE) 
    public Contact createContact(@RequestBody Contact contact) throws Exception 
     { 
      return ContactService.createContact(contact); 
     } 

我Contact.java

public class Contact 
{ 

    private String ID = UUID.randomUUID().toString(); 

    private String type = "contact"; 

    private String category; 

    private String name; 
} 

我想實現的是 '類型' 字段不應該在請求JSON傳遞。如果消費者通過該值,我需要拋出一個異常。

我可以將json作爲Map或字符串進行驗證,然後將其轉換爲POJO。但在直接投射之前是否可以驗證它?

+0

註冊驗證器攔截由於對象是使用傑克遜映射解析,相應註解你的對象,使用XML傑克遜註釋。這應該可以解決你的問題。 – Schaka

+0

@Schaka - 在對象級別註釋將是全局性的。對於某些請求,我需要阻止請求負載中的'type'字段並拋出異常,但是在其他請求中,我需要接受'type'字段。你能幫我解決嗎? –

回答

1

這可以使用攔截器來完成,該攔截器將延伸HandlerInterceptor。例如,您可以創建一個ContactRequestValidator類,如下所示。

@Component("contactRequestInterceptor") 
public class ContactRequestValidator implements HandlerInterceptor { 

    @Override 
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 
     // get the request payload using reader from httpServletRequest and do the validation 
     // and throw an exception if not valid and may handle it using an Spring MVC exception handler 
    } 

    // other two methods omitted.. 
} 

然後用

@Configuration 
public class MVCConfigurerAdapter extends WebMvcConfigurerAdapter { 

    @Autowired 
    @Qualifier("contactRequestInterceptor") 
    private HandlerInterceptor contactRequestValidator; 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(contactRequestValidator).addPathPatterns("/api/**"); // Also have the option to use Ant matchers 
    } 
}