java web过滤器排除_java - Spring @ComponentScan排除/包含过滤器 - 堆栈内存溢出

探讨SpringMVC中使用@RestControllerAdvice进行异常处理时,通用异常处理与特定异常处理之间的优先级问题。当同时定义了通用Exception处理和特定ServiceException处理时,发现特定处理未被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为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覆盖了更具体的一个。

<?xml version="1.0" encoding="UTF-8" ?> <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <property name="LOG_FILE" value="./logs/jetlinks-pro.log"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> <appender name="LOGEventPublisher" class="org.jetlinks.community.logging.logback.SystemLoggingAppender"/> <appender name="ErrorLOGEventPublisher" class="org.jetlinks.community.logging.logback.SystemLoggingAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> </appender> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> <charset>${FILE_LOG_CHARSET}</charset> </encoder> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern> <cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart> <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize> <totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap> <maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory> </rollingPolicy> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>WARN</level> </filter> </appender> <!--控制台使用异步打印,防止阻塞--> <appender name="AsyncConsoleAppender" class="ch.qos.logback.classic.AsyncAppender"> <!-- 队列的深度,该值会影响性能,默认 256 --> <queueSize>256</queueSize> <!-- 设为 0 表示队列达到 80%,也不丢弃任务--> <discardingThreshold>0</discardingThreshold> <!-- 日志上下文关闭后,AsyncAppender 继续执行写任务的时间,单位毫秒 --> <maxFlushTime>1000</maxFlushTime> <!-- 队列满了是否直接丢弃要写的消息,false、丢弃,true、不丢弃 --> <neverBlock>true</neverBlock> <!--是否记录调用栈--> <includeCallerData>true</includeCallerData> <!--One and only one appender may be attached to AsyncAppender,添加多个的话后面的会被忽略--> <appender-ref ref="CONSOLE"/> </appender> <springProfile name="dev"> <logger name="system" level="debug"> <appender-ref ref="LOGEventPublisher"/> </logger> <root level="INFO"> <appender-ref ref="AsyncConsoleAppender"/> <appender-ref ref="ErrorLOGEventPublisher"/> </root> </springProfile> <springProfile name="test"> <root level="INFO"> <appender-ref ref="AsyncConsoleAppender"/> <appender-ref ref="FILE"/> </root> </springProfile> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="AsyncConsoleAppender"/> <appender-ref ref="LOGEventPublisher"/> <appender-ref ref="FILE"/> </root> </springProfile> </configuration>在这基础优化
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值