java 使用JBoss和代理的Stacktrace中的未知源

jtw3ybtb  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(124)

bounty还有3天到期。回答此问题可获得+300声望奖励。Joe D希望引起更多关注这个问题。

下面的stacktrace在运行时显然会产生NullPointerException:

2023-04-10 13:54:50,790 ERROR [org.jboss.as.ejb3.invocation] (default-threads - 44) [ ] [null ] [ ] [ ] [ ] JBAS014134: EJB Invocation failed on component VotingResultsHelper for method public void com.example.voting.impl.helpers.VotingResultsHelper.calculateNewProtocol(com.example.voting.api.dto.request.OnlineVotingProtocolMakeRequest,com.example.voting.impl.persistence.model.VotingVersion):

.... 

    at com.example.voting.impl.helpers.VotingResultsHelper$$$view1332.calculateNewProtocol(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor4488.invoke(Unknown Source) [:1.8.0_111]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_111]
    at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_111]
    at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:267)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
    at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:263)
    at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:115)
    at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105)
    at com.example.voting.impl.helpers.VotingResultsHelper$Proxy$_$$_Weld$Proxy$.calculateNewProtocol(VotingResultsHelper$Proxy$_$$_Weld$Proxy$.java)
    at com.example.voting.impl.VotingMessageServiceImpl.makeOnlineVotingProtocol(VotingMessageServiceImpl.java:661)

...

Caused by: java.lang.NullPointerException

据推测,异常发生在com.example.voting.impl.helpers.VotingResultsHelper类的calculateNewProtocol()方法中。
我只想知道几件事
1.有没有办法找出com.example.voting.impl.helpers.VotingResultsHelper类的代理版本中发生异常的确切位置?我是否需要以不同的方式构建/部署应用程序来实现这一点?为什么它给予了calculateNewProtocol()的未知数,而不是makeOnlineVotingProtocol()

  1. calculateNewProtocol()方法调用其他私有方法。是否保证异常发生在此方法中而不是私有方法中?stacktrace中没有其他方法。
vsmadaxz

vsmadaxz1#

已经有很长一段时间没有使用Weld了,但我会尽我所能回答你的问题。
1.有没有办法找出com.example.voting.impl.helpers.VotingResultsHelper类的代理版本中异常发生的确切位置?
正如您所猜测的,Weld正在为VotingResultsHelper创建代理,可能是因为在某种程度上被定义为VotingMessageServiceImpl的CDI依赖项。
不幸的是,由Weld生成的类不包含允许JVM识别导致错误的实际源代码的必要信息。
您可以尝试配置Weld,通过为org.jboss.weld.proxy.dump配置属性定义适当的值来提供生成的代理/增强子类的转储,这可能会有所帮助。
我是否需要以不同的方式构建/部署应用程序来实现这一点?
AFAIK无法提供必要的检测/调试信息。
为什么它给予了calculateNewProtocol()的未知数,而makeOnlineVotingProtocol()的未知数?
如果不知道VotingResultsHelperVotingMessageServiceImpl的实际源代码,很难说,但可能是因为VotingMessageServiceImpl和/或makeOnlineVotingProtocol没有代理。
calculateNewProtocol()方法调用其他私有方法。是否保证异常发生在此方法中而不是私有方法中?堆栈跟踪中没有其他方法。
Weld不会代理私有方法。此外,在背后,calculateNewProtocol方法的代理版本将在VotingResultsHelper类中使用实际的calculateNewProtocol:如果该方法调用另一个私有方法,则异常堆栈跟踪应反映该调用。
为了验证这个假设,请尝试在任何私有方法中引发一个异常,并查看结果堆栈跟踪是否反映了该错误。

相关问题