java - CDI:jar 中的接口(interface)无法解析为本地 Wildfly 8.0

标签 java cdi wildfly

我正在尝试将现有 Java 7 应用程序从 Jboss 7.1 迁移到 Wildfly 8.0,但遇到了一些 CDI 问题。

项目的结构如下:

 ear
    |
    |--> base.service.impl.war
    |--> mad.impl.war --> contains SessionServiceImpl.class
    |--> lib
        |
        |-> base.api.jar
        |-> base.api.impl.jar --> contains SessionService.class

SessionService 是没有注释的纯 Java 接口(interface)。 SessionServiceImpl 看起来像这样:

@Stateless
@EJB(name = SessionService.JNDI_NAME, beanInterface = SessionService.class)
public class SessionServiceImpl implements SessionService {

}

EJB 似乎已注册:

INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named SessionServiceImpl in deployment unit subdeployment "com.mad.impl.war" of deployment "com.deployment.ear.ear" are as follows:

    java:global/com.server.deployment.ear/com.mad.impl/SessionServiceImpl!com.base.session.SessionService
    java:app/com.mad.impl/SessionServiceImpl!com.base.session.SessionService
    java:module/SessionServiceImpl!com.base.session.SessionService
    java:global/com.deployment.ear/com.mad.impl/SessionServiceImpl
    java:app/com.mad.impl/SessionServiceImpl
    java:module/SessionServiceImpl

但是之后,当 CDI 容器开始部署时,我收到以下错误:

ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."com.deployment.ear.ear".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."com.deployment.ear.ear".WeldStartService: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) [jboss-msc-1.2.0.Final.jar:1.2.0.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
Caused by: org.jboss.msc.service.ServiceNotFoundException: Service service jboss.deployment.subunit."com.deployment.ear.ear"."com.mad.impl.war".component.SessionServiceImpl.VIEW."com.base.session.SessionService".LOCAL not found

我尝试用 @Local 注释接口(interface),但这没有帮助。

Maven Ear-plugin 配置如下:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <version>6</version>
                <initializeInOrder>true</initializeInOrder>
                <defaultLibBundleDir>/lib</defaultLibBundleDir>
                <modules>
                    <jarModule>
                            <groupId>mygroup</groupId>
                            <artifactId>com.base.impl</artifactId>
                        </jarModule>

                        <webModule>
                            <groupId>mygroup</groupId>
                            <artifactId>com.base.service.impl</artifactId>
                            <contextRoot>/impl.base.server</contextRoot>
                            <bundleFileName>com.base.impl.war</bundleFileName>
                        </webModule>

                        <webModule>
                            <groupId>mygroup</groupId>
                            <artifactId>com.mad.impl</artifactId>
                            <contextRoot>/impl.mad.server</contextRoot>
                            <bundleFileName>com.mad.impl.war</bundleFileName>
                        </webModule>
                    </modules>
                </configuration>
            </plugin>

最佳答案

问题出在无状态 bean 上。 CDI 在为 session bean 注入(inject)远程接口(interface)时存在问题。正如错误所示,它正在尝试为 SessionServiceImpl 注入(inject) LOCAL 接口(interface),但这不可能发生,因为自从 SessionServiceImpl 实现 SessionService 以来,ejb 容器(基于 ejb 规范)仅公开了一个远程接口(interface),并且没有使用 @LocalBean 进行注释。

关于 ejb3.1 的注意事项:

  • 如果 session bean 实现了 Serialized 以外的任何接口(interface), 可比较,可外部化,那么实现的接口(interface)将是 被视为 bean 的远程接口(interface)。
  • 此外,您还使用 @EJB 注释定义了远程 SessionServiceImpl 的接口(interface),因此它没有放置在 LOCAL 命名空间,但位于 REMOTE 命名空间中。

关于java - CDI:jar 中的接口(interface)无法解析为本地 Wildfly 8.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31721210/

相关文章:

Java wait() 和 notify() 无法正常工作

java - CDI 生产商未获得资格认证

java - 通过关闭 Hook 关闭的 Weld SE 不会执行 @PreDestroy

java - 在线程中进行 DAO 注入(inject)

java - 监控jms消息的工具

java - Usb4Java:管道错误(-9)

java - Android: finish() Activity 运行时异常

java - Dagger2 找不到带注释的方法

java - 无法在 Glassfish 3.1.2 上将 CDI 使用到 WAB 中

java - Eclipse 上的 WildFly 8 - 是否需要安装所有 JBoss 工具插件?