如何排除特定异常被记录在aspectj?
我们正在使用spring安全性,因此我们已经实现了UserDetailsService。
当用户输入不存在的用户名时,Spring会抛出org.springframework.security.core.userdetails.UsernameNotFoundException
。
我们希望从日志中排除该特定异常,但不是从它抛出的类(UserDetailsService的实现)。
例如,在以下日志中,我们只需要第一行(输入... UserDetailsServiceImpl)而不是后面的错误。
22 Jun 2014 14:20:35 INFO LoggingAspect - Entering: ...UserDetailsServiceImpl Method name: loadUserByUsername Method arguments : [***]
22 Jun 2014 14:20:42 ERROR LoggingAspect - Unhandled exception caught: ...service.UserDetailsServiceImpl loadUserByUsername
org.springframework.security.core.userdetails.UsernameNotFoundException: User with loginName: *** doesnt exist
at ...UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:30)
...
春天AOP有没有办法做到这一点?
编辑: 这就是我们在LoggingAspect中所拥有的:
@AfterThrowing(pointcut = "execution(* ..*.*(..)) && !methodsExcludedFromLog()", throwing = "exp")
public void afterThrowing(JoinPoint joinPoint, Throwable exp) {
...
}
我这需要以某种方式更改throwing
以排除弹簧异常,但我不知道该怎么做。
编辑2: 因此,正如评论中所建议的那样,我尝试在log4j中添加一个过滤器,但它似乎不起作用,并且异常不会被过滤掉。谁知道问题可能是什么?
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss} %5p %c{1} - %m%n" />
</layout>
</appender>
<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="append" value="false" />
<param name="file" value="${catalina.home}/logs/MYAPP.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
</layout>
<filter class="org.apache.log4j.filter.ExpressionFilter">
<param name="expression" value="EXCEPTION ~= org.springframework.security.core.userdetails.UsernameNotFoundException" />
<param name="acceptOnMatch" value="false"/>
</filter>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="consoleAppender" />
<appender-ref ref="fileAppender" />
</root>
感谢。
答案 0 :(得分:0)
如评论中所述,您只能使用
{
if (e instanceof UsernameNotFoundException)
return;
// Log exception
}
在你的建议开始时。 AspectJ或Spring AOP中没有语法方式以某种方式在“投掷”部分中使用jokers或boolean表达式。在那里,您只能通过将抛出的异常绑定到类型变量来捕获所有异常或隐式地将选择范围缩小到一个特定类型(及其子类型)。如果你考虑一下,你应该如何将一个对象绑定到一个具有多种类型的变量?
无论你喜欢与否,这都是正确的答案。我现在无法为您更改AspectJ语法和语义。 : - )