作为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)并将过滤器应用于该注释。

09-11 17:56