我有WebService。 我通过扩展SoapFaultMappingExceptionResolver编写了自己的异常解析器。
每当我试图抛出异常时,我都会得到NPE:
java.lang.NullPointerException
at org.springframework.ws.server.endpoint.AbstractEndpointExceptionResolver.resolveException(AbstractEndpointExceptionResolver.java:104)
这就发生在线:
if (logger.isDebugEnabled()) {
logger.debug("Resolving exception from endpoint [" + endpoint + "]: " + ex);
}
因为记录器为空。 正如我在调试过程中所理解的那样,这是因为我的扩展ExceptionResolver正由CGLIB代理。 CGLIB代理里面有我解析器的副本,但是对于所有空字段,它还包含对我的实际(初始化)解析器的引用,它看起来像:
CGLIB$CALLBACK_0 = {org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor@19853}
CGLIB$CALLBACK_1 = {org.springframework.aop.framework.CglibAopProxy$StaticUnadvisedInterceptor@19854}
如果我进入那些回调,targetSource-target,我可以看到我的解析器具有初始化属性。
那么我该如何解决这个问题呢?
答案 0 :(得分:0)
好吧,我找到了一个小的解决方法。我根本不想禁用代理,因为在某些情况下我需要它。 所以,基本上,你可以在你的配置中拥有:
<aop:aspectj-autoproxy proxy-target-class="true" />
启用全局代理。 为了修复我的异常解析器,我已将它添加到例外列表中,如下所示:
<aop:aspectj-autoproxy proxy-target-class="false">
<aop:include name="myExceptionResolver" />
</aop:aspectj-autoproxy>