RestControllerAdvice (например, с аннотациями, basePackages не работает), но без аннотаций basePackages работает нормально - PullRequest
0 голосов
/ 30 октября 2018

Это немного странно. Я пытаюсь поймать исключение HttpRequestMethodNotSupportedException.class, используя RestControllerAdvice, манипулируя аннотациями = RestController.class

Однако, это не работает. Но когда я удаляю аннотации, все работает нормально. Я тоже пробовал с basePackages, и он такой же - как другие фильтры атрибутов.

Пример кода, как показано ниже:

@RestControllerAdvice(annotations = RestController.class)
public class WebApiAdvice {

@ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
protected Object methodNotSupportedErrorHandler(HttpServletRequest request, Exception exception) throws Exception {
    return processAndResponse(request, exception, HttpStatus.METHOD_NOT_ALLOWED);
}

public ResponseEntity<ExceptionBean> processAndResponse(HttpServletRequest request, Exception exception, HttpStatus status) {
    ExceptionBean exceptionBean = new ExceptionBean();
    exceptionBean.setExceptionCode(status.name());
    exceptionBean.setExceptionMessage("Message - "+status.getReasonPhrase());
    System.out.println(exception.toString()+" "+exception.getMessage());
    return new ResponseEntity(exceptionBean, status);     
}
}

и контроллер:

@RestController
public class QueryResultController {

@RequestMapping(value="/websapi/queryResult", method = RequestMethod.POST)
public String viewResponse(@RequestBody String jSONData, HttpServletRequest request, HttpServletResponse response) {
    System.out.println(request.getParameter("test"));
    return "test";
}}

Моя конечная цель - предоставить класс Advice для каждого типа ControllerAdvice и RestControllerAdvice. Добавление любого из фильтров атрибутов (basePackages, аннотации и т. Д.) В результате не работает. Но, удалив фильтр атрибутов, он работает нормально. Он даже может выдать ответ JSON (для RestControllerAdvice), как и предполагалось.

Журнал был чистым, поскольку показал, что ControllerAdvice всегда был зарегистрирован в обоих случаях:

[localhost-startStop-5] o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Detected @ExceptionHandler methods in webApiAdvice

Вот настройка в dispatcher-servlet.xml:

<context:component-scan base-package="com.celtro.ken.op.support.util, com.celtro.ken.op.support.config, com.celtro.ken.op.support.advice, com.celtro.ken.op.support.interceptor, com.celtro.ken.op.controller" />

<mvc:annotation-driven />

Кстати, я использую Spring 4.3.10.

В успешном сценарии JSON в браузере будет просто выплевывать:

{"exceptionCode":"METHOD_NOT_ALLOWED","exceptionMessage":"Message - Method Not Allowed"}

В случае сбоя браузер выдаст распространенную ошибку Apache Tomcat:

HTTP Status 405 – Method Not Allowed
Type Status Report
Message Request method 'GET' not supported
Description The method received in the request-line is known by the origin server but not supported by the target resource.
Apache Tomcat/8.5.23

Я пытался это некоторое время. Цените любого, чтобы выделить, где это пошло не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...