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