作为Spring MVC应用程序中的一个好习惯,Web配置应该只选择“前端”组件,例如@Controller或@RestController 。
每个其他bean都应该由Root应用程序上下文选取。
我已经将Web配置定义如下(请记住,我不需要@EnableMvc注释,因为它扩展了WebMvcConfigurationSupport )
@Configuration
@ComponentScan(
basePackages = { ... },
useDefaultFilters = false,
includeFilters = @Filter({
Controller.class,
ControllerAdvice.class}))
而Root的配置如下。
@Configuration
@ComponentScan(
basePackages = { ... },
excludeFilters = @Filter({
Controller.class,
ControllerAdvice.class}))
我已经定义了两个@RestControllerAdvice类,第一个捕获所有通用Exception ,第二个捕获更具体的ServiceException 。
抛出ServiceException ,永远不会调用特定的顾问,而只选择通用的顾问。 两个配置类中的基础包都是相同的。
我是否还RestControllerAdvice在排除和包含过滤器上指定RestControllerAdvice ? 还是我错过了别的什么?
编辑:
@RestControllerAdvice都没有basePackeges或任何特定条件。 并且实际找到并注册了ServiceException 。
如果我将异常处理程序移动到工作处理程序而不是它被调用。 这就是我的工作方式。 如果我将ServiceException处理程序移动到一个单独的类中,则不再调用它。
@RestControllerAdvice
public class GlobalRestControllerAdviser extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity handleBindException(
final BindException ex,
final HttpHeaders headers,
final HttpStatus status,
final WebRequest request) {
return new ResponseEntity(
buildPresentableError(ex.getAllErrors().get(0)),
HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(ServiceException.class)
protected Response> handleServiceException(final ServiceException e) {
...
}
@ExceptionHandler(Exception.class)
protected ResponseEntity handleGenericException(final Exception ex) {
...
}
}
似乎最通用的ExceptionHandler覆盖了更具体的一个。