【问题标题】:@EJB dependency injection cannot classcast Object to Object$view29@EJB 依赖注入不能将 Object 类转换为 Object$view29
【发布时间】:2015-11-15 20:22:23
【问题描述】:

我通过将 EJB 包移动到 WEB 模块而不是 EJB 模块来修复它。有人知道为什么吗?

我不断收到以下错误。它说 EditEnterpriseSessionBean 与 EditEnterpriseSessionBean$$$view81 不是同一个类。

错误由三部分组成:

21:18:36,880 错误 [io.undertow.request](默认任务 40)UT005023:对 /EntWeb/ListEnterprisesServlet 的异常处理请求:javax.servlet.ServletException:UT010013:无法实例化 ListEnterprisesServlet强> [..]

原因:java.lang.IllegalStateException: WFLYEE0042: 未能构造组件实例 [..]

原因:java.lang.IllegalArgumentException:无法将 EditEnterpriseSessionBean 字段 ListEnterprisesServlet.edtEnterprise 设置为 EditEnterpriseSessionBean$$$view81 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:167) 在 sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException (UnsafeFieldAccessorImpl.java:171) 在 sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) [...]

你对这个有什么想法吗?

提前致谢!

完整的堆栈跟踪:

Context Path:/EntWeb
Servlet Path:/AddOrderServlet
Path Info:null
Query String:null
Stack Trace
javax.servlet.ServletException: UT010013: Could not instantiate AddOrderServlet
io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:227)
io.undertow.servlet.core.ManagedServlet.getServlet(ManagedServlet.java:169)
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 我通过将我的 EJB 类从我的 EJB 模块移动到我的 WEB 模块来修复它。为什么它现在有效,而不是以前!?
  • 你在部署耳朵吗?
  • @JohnAment 是的,我部署了一个 EAR,将 EJB、Web 和 JPA 作为模块。我检查了一下,ejb.jar(和 web.war)在 .ear 文件中。
  • 请提供您的完整堆栈跟踪。如果我不得不猜测,您最终会在 EAR 中使用重复的类,检查您的输出 EAR 将是确认的唯一方法。一般来说,并不特别鼓励 EAR 部署。
  • @JohnAment 感谢您的努力!我在帖子中添加了堆栈跟踪。

标签: jakarta-ee ejb cdi


【解决方案1】:

当您有单独的 ejb 和 war 模块时,您应该使用远程接口。如果在 war 模块中包含 ejb 模块,将创建两个 ejb bean。 ear中打包的ejb和war模块中包含的jar文件中的其他集合。

在运行时,这很混乱,因为您的 war 模块可以使用两组具有不同类加载器的 bean

【讨论】:

  • 由于 EJB 和 Web 模块在同一个 EAR 中,我认为 @Local 应该可以工作。将@Local 更改为@Remote 有效。我想这意味着 ejb.jar 在与 web.war 不同的 VM 中执行?否则 @Local 应该可以工作。
【解决方案2】:

为了能够使用@Local 接口,请确保该接口仅在ear 文件的lib 文件夹中,而不是在war 文件中的lib 中。如果您使用的是 Maven,您可以将依赖范围设置为提供给 war 项目的 pom 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多