AbstractEndpointExceptionResolver,cglib proxy,空字段

时间:2016-06-01 11:21:07

标签: java spring proxy cglib

我有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,我可以看到我的解析器具有初始化属性。

那么我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个小的解决方法。我根本不想禁用代理,因为在某些情况下我需要它。 所以,基本上,你可以在你的配置中拥有:

<aop:aspectj-autoproxy proxy-target-class="true" />

启用全局代理。 为了修复我的异常解析器,我已将它添加到例外列表中,如下所示:

<aop:aspectj-autoproxy proxy-target-class="false">
    <aop:include name="myExceptionResolver" />
</aop:aspectj-autoproxy>