gpt4 book ai didi

java - Spring @Around 用于异常处理

转载 作者:行者123 更新时间:2023-11-30 11:23:07 24 4
gpt4 key购买 nike

情况如下:我的应用程序扩展了一个框架。所以我没有 main() 或我声明的任何其他入口点(我覆盖了该框架提供的方法,它安排了其他一切)。这个框架可以变得安全;安全性建立在 apache mina 之上。

当与应用建立不安全连接时,mina 抛出异常,堆栈跟踪如下:

Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at sun.security.ssl.EngineInputRecord.bytesInCompletePacket(EngineInputRecord.java:171) ~[na:1.7.0_21]
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:845) ~[na:1.7.0_21]
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) ~[na:1.7.0_21]
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) ~[na:1.7.0_21]
at org.apache.mina.filter.support.SSLHandler.unwrap0(SSLHandler.java:657) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.support.SSLHandler.unwrapHandshake(SSLHandler.java:613) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.support.SSLHandler.handshake(SSLHandler.java:493) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.support.SSLHandler.messageReceived(SSLHandler.java:306) ~[mina-filter-ssl-1.1.7.jar:na]
at org.apache.mina.filter.SSLFilter.messageReceived(SSLFilter.java:392) ~[mina-filter-ssl-1.1.7.jar:na]
... 12 common frames omitted

我想使用 AOP 技巧来捕获它,这样我就可以以一种很好的方式通知用户,并可以发送警报。我想到了这个方面:

@Aspect
public class SSLExceptionCatcherAdvice {

private static final Logger LOG = LoggerFactory.getLogger(SSLExceptionCatcherAdvice.class);

@Around("execution(* *.unwrap(..))")
public void catchException(ProceedingJoinPoint pjp) {
try {
pjp.proceed();
} catch (Throwable exception) {
LOG.info("########################################");
}
}

}

但是,它根本不会被调用。这个方面很好,顺便说一句,它可以从我的代码库中捕获其他方法调用。

对此有何建议?提前致谢。

最佳答案

Spring 默认使用基于代理的 AOP 解决方案,因此只有 Spring 管理的 bean 才能应用这些方面。它不适用于非 spring 管理的 bean。参见 this section of the reference guide .

您正试图拦截 javax. 程序包上的执行,这是一种特殊情况,只能在 load-time weaving environment 中运行。而不是基于代理或基于编译时的解决方案。此外,使用加载时编织来编织它们也可能很棘手,因为这些类可能在加载时编织开始之前就已经加载了。

The aspect is fine, btw, it can catch other method invocations from my codebase.

实际上你的方面是有缺陷的,@Around 建议应该总是返回 Object 并且应该总是返回调用 proceed() 的结果方法(除非您重新抛出 Exception。您的方面中断正确返回结果,现在每个方法有效地返回 null

链接:

  1. 代理机制 | reference guide
  2. 在 Spring 框架中使用 AspectJ 进行加载时编织 | reference guide
  3. 周围建议 | reference guide

关于java - Spring @Around 用于异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21377582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com