2017-01-17 11 views
2

Ich habe eine @ControllerAdvice deklariert, die RequestBodyAdvice implementiert. Mein Problem, dass es nicht ausgelöst wird. Ich habe eine ResponseBodyAdvice in dem gleichen Paket, das wie erwartet funktioniert.Spring RequestBodyAdvice wird nicht ausgelöst

@RestControllerAdvice 
public class RestPreProcessingAdvice implements RequestBodyAdvice { 

    @Override 
    public boolean supports(final MethodParameter methodParameter, final Type targetType, 
     final Class<? extends HttpMessageConverter<?>> converterType) { 
    return checkIfElegiable(...); 
    } 

    @Override 
    public Object handleEmptyBody(final Object body, final HttpInputMessage inputMessage, final MethodParameter parameter, 
     final Type targetType, final Class<? extends HttpMessageConverter<?>> converterType) { 
    return body; 
    } 

    @Override 
    public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, final MethodParameter parameter, 
     final Type targetType, final Class<? extends HttpMessageConverter<?>> converterType) throws IOException { 
    return doSomeProcessing(...); 
    } 

    @Override 
    public Object afterBodyRead(final Object body, final HttpInputMessage inputMessage, final MethodParameter parameter, 
     final Type targetType, final Class<? extends HttpMessageConverter<?>> converterType) { 
    return body; 
    } 
} 

ich gedebuggt und sehe, dass diese @ControllerAdvice in ControllerAdviceBean.findAnnotatedBeans() gefunden wird. Aber warum es nicht ausgelöst wurde, konnte ich bisher nicht herausfinden.

Ich denke, einige andere Leute haben ähnliche Probleme. Siehe How to use RequestBodyAdvice und Spring RequestBodyAdvice is not picking up by the mock MVC frame work, how ever it is working for ResponseBodyAdvice.

+0

Hallo. Hast du das jemals herausgefunden? Ich habe ein ähnliches Problem. – user2294382

+0

Leider nicht. Halten Sie mich auf dem Laufenden, wenn Sie es herausfinden. – user871611

+0

Ich habe tatsächlich versucht, die JsonViewRequestBodyAdvice-Implementierung zu laden, die ich herausfand, wird automatisch hinzugefügt, wenn Jackson auf dem Klassenpfad ist. Aber als ich das herausgefunden habe, fand ich eine Lösung. Siehe unten. – user2294382

Antwort

0

Sie können DelegatingWebMvcConfiguration verwenden, um den RequestBodyAdvice festzulegen.

@Configuration 
public class WebConfig extends DelegatingWebMvcConfiguration { 

    public RequestBodyAdvice myRequestBodyAdvice(){ 
     return new MyRequestBodyAdvice(); 
    } 


    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { 
     RequestMappingHandlerAdapter adapter = 
super.requestMappingHandlerAdapter(); 
     adapter.setRequestBodyAdvice(Arrays.asList(myRequestBodyAdvice())); 
     return adapter; 
    } 
} 

Siehe Abschnitt 22.16.13 in Spring Framework Docs

1

In Ihrer Controller-Methode versuchen, den Methodenparameter mit @RequestBody mit Anmerkungen versehen.

z.

@RestController 
public class MyController{ 

    @RequestMapping(.......) 
    public MyResponse greetings(@RequestBody MyRequest requestObject){ 
     //implementation 
    } 

} 

RequestResponseBodyMethodProcessor Klasse (und seine Basisklasse AbstractMessageConverterMethodArgumentResolver) sind verantwortlich für die verschiedenen abstrakten Methoden aufrufen (beforeBodyRead, afterBodyRead etc) von RequestBodyAdvice. RequestMappingHandlerAdapter würde RequestResponseBodyMethodProcessor wählen, um die Anfrage nur zu bearbeiten, wenn das Argument der Controller-Methode mit mit @RequestBody annotiert ist. Wir können diese Logik in der supportsParameter-Methode von RequestResponseBodyMethodProcessor implementiert sehen.

Ich denke, eine alternative Art und Weise unseres eigeneMethodProcessor von erstrecktRequestResponseBodyMethodProcessor und zwingenden seine supportsParameter Verfahren zu schaffen, wäre unsere eigene Logik zu setzen. Ich habe das jedoch nicht getestet.

Verwandte Themen