2016-03-23 5 views
0

Ich möchte das eingehende Json-Objekt im Controller validieren, bevor es mit Spring Jackson auf POJO geworfen wird.Validieren Sie das Json-Objekt, bevor Sie es in POJO umwandeln - mit @requestBody

Mein Controller:

@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); 
     } 

Mein Contact.java

public class Contact 
{ 

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

    private String type = "contact"; 

    private String category; 

    private String name; 
} 

Was ich zu erreichen versuche, ist, dass 'Typ' Feld sollte nicht in der Anfrage json weitergegeben werden. Ich muss eine Ausnahme auslösen, wenn der Verbraucher diesen Wert übergibt.

Ich kann den JSON als Map oder String abrufen und validieren und dann an POJO übergeben. Aber ist es möglich, es vor dem direkten Gießen zu validieren?

+0

Da das Objekt analysiert wird unter Verwendung von Jackson-Mapping, mit Anmerkungen versehen Objekt entsprechend, mit Jackson XML Anmerkungen. Das sollte dein Problem lösen. – Schaka

+0

@Schaka - Die Annotation in der Objektebene wird global sein. Für bestimmte Anfragen muss ich das 'type'-Feld in der Anforderungsnutzlast blockieren und Ausnahme auslösen, aber wo ich in anderen Anfragen das' type'-Feld akzeptieren muss. Kannst du mir dabei helfen? –

Antwort

1

Dies kann mit einem Interceptor durchgeführt werden, der HandlerInterceptor verlängert. Beispielsweise können Sie eine ContactRequestValidator-Klasse wie unten erstellen.

@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.. 
} 

Dann den Validator Interceptor registrieren

@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 
    } 
} 
Verwandte Themen