作为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
都没有basePackeges
或任何特定条件。并实际上找到并注册了
ServiceException
1。如果我将异常处理程序移至工作处理程序,则它将被调用。
这就是我的工作方式。如果将
ServiceException
处理程序移到单独的类中,则不再调用它。@RestControllerAdvice
public class GlobalRestControllerAdviser extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleBindException(
final BindException ex,
final HttpHeaders headers,
final HttpStatus status,
final WebRequest request) {
return new ResponseEntity<Object>(
buildPresentableError(ex.getAllErrors().get(0)),
HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(ServiceException.class)
protected Response<?> handleServiceException(final ServiceException e) {
...
}
@ExceptionHandler(Exception.class)
protected ResponseEntity<Object> handleGenericException(final Exception ex) {
...
}
}
似乎最通用的
ExceptionHandler
覆盖了更具体的ojit_code。 最佳答案
几乎在那儿,使用 FilterType type
并分离过滤器。
@Configuration
@ComponentScan(
basePackages = { ... },
excludeFilters = {
@ComponentScan.Filter(type=FilterType.ANNOTATION, value=Controller.class),
@ComponentScan.Filter(type=FilterType.ANNOTATION, value=ControllerAdvice.class)
}
)
另外,我建议您创建一个自定义注释(例如
@FrontEnd
)并将过滤器应用于该注释。