0

在尝试将应用程序从 JBoss EAP 5 迁移到 JBoss EAP 以及添加一些额外的功能(例如 JAX-RS)时,我收到以下错误:

WELD-000082:类 net.MyCompany.My.service.MyIPAuthJaxRsService 的无状态会话 bean 上不允许范围接口 javax.enterprise.context.RequestScoped。仅允许使用 @Dependent。

完整的堆栈跟踪:

    1:02:29,721 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC000001: Failed to start service jboss.deployment.unit."C1Authentication.ear".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."C1Authentication.ear".WeldStartService: Failed to start service
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: org.jboss.weld.exceptions.DefinitionException: WELD-000082: Scope interface javax.enterprise.context.RequestScoped is not allowed on stateless session beans for class net.MyCompany.My.service.MyIPAuthJaxRsService. Only @Dependent is allowed.
        at org.jboss.weld.bean.SessionBean.checkScopeAllowed(SessionBean.java:122)
        at org.jboss.weld.bean.SessionBean.internalInitialize(SessionBean.java:101)
        at org.jboss.weld.bean.RIBean.initialize(RIBean.java:69)
        at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$5.doWork(ConcurrentBeanDeployer.java:121)
        at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$5.doWork(ConcurrentBeanDeployer.java:118)
        at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63)
        at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        at org.jboss.threads.JBossThread.run(JBossThread.java:320)

在 Eclipse 中,项目方面位于 EJB 3.2 和 Java 1.7

我的 EJB-Jar.xml 文件包含:

    <?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd" version="3.2">
        <display-name>C1AuthService</display-name>
        <enterprise-beans>
            <session>
                <ejb-name>MyWSService</ejb-name>
                <ejb-class>net.MyCompany.My.service.MyWSService</ejb-class>
                <session-type>Stateless</session-type>
                <transaction-type>Container</transaction-type>
            </session>
            <session>
                <ejb-name>MyIPAuthJaxRsService</ejb-name>
                <ejb-class>net.MyCompany.My.service.MyIPAuthJaxRsService</ejb-class>
                <session-type>Stateless</session-type>
                <transaction-type>Container</transaction-type>
            </session>
            <session>
                <ejb-name>MyIPAuthJaxRsServiceApplication</ejb-name>
                <ejb-class>net.MyCompany.My.service.MyIPAuthJaxRsServiceApplication</ejb-class>
                <session-type>Stateless</session-type>
                <transaction-type>Container</transaction-type>
            </session>
        </enterprise-beans>
    </ejb-jar>

两个 JAX-RS 类是:

    package net.mycompany.my.service;

    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    import java.util.HashSet;
    import java.util.Set;

    @ApplicationPath(value="/C1AuthService")
    public class MyIPAuthJaxRsServiceApplication extends Application {

        private Set singletons = new HashSet();

        public MyIPAuthJaxRsServiceApplication() {
            singletons.add(new MyIPAuthJaxRsService());
        }

        @Override
        public Set getSingletons() {
            return singletons;
        }

        @Override
        public Set> getClasses() {
            // TODO Auto-generated method stub
            return null;
        }
    }
    package net.mycompany.my.service;

    import javax.ws.rs.GET;
    import javax.ws.rs.Path;

    @Path("/C1AuthService")
    public class MyIPAuthJaxRsService {
        public MyIPAuthJaxRsService() {
        }

        @GET
        @Path("/test")
        public String test() {
            return "Hello RESTFul 2";
        }

    }
4

1 回答 1

0

事实证明,在网上搜索了一下后,我发现以下文章提供了一个线索: https ://dzone.com/articles/valid-cdi-scopes-session-ejb

我也偶然发现了这个: http ://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html/CDI.html

似乎发生的事情是在 EJB-Jar.xml 中,我将 EJB 声明为无状态会话 bean,并且通过不在 java 类本身中注释它们,CDI/Weld 将它们默认为 @Dependent,例如来自 JBoss文章A CDI bean that does not explicitly define a scope is @Dependent scoped by default.

只需将以下导入和注释添加到两个类:

    package net.mycompany.my.service;

    import javax.ejb.Stateless;
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    import java.util.HashSet;
    import java.util.Set;

    @Stateless
    @ApplicationPath(value="/C1AuthService")
    public class MyIPAuthJaxRsServiceApplication extends Application {

        private Set singletons = new HashSet();

        public MyIPAuthJaxRsServiceApplication() {
            singletons.add(new MyIPAuthJaxRsService());
        }

    }
    package net.mycompany.my.service;

    import javax.ejb.Stateless;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;

    @Stateless
    @Path("/C1AuthService")
    public class MyIPAuthJaxRsService {
        public MyIPAuthJaxRsService() {
        }

        @GET
        @Path("/test")
        public String test() {
            return "Hello RESTFul 2";
        }

    }

基本上检查您是否已使用 EJB 注释@Stateless并添加了正确的导入import javax.ejb.Stateless;

编辑- 正如@SteveC 指出的那样,我已经删除了覆盖,但是当我尝试从 MyIPAuthJaxRsServiceApplication 中删除 @Stateless 时,正如他所建议的那样,我最终再次获得了 MyIPAuthJaxRsServiceApplication 的异常。另外值得注意的是,这个例子甚至没有工作,因此在 EJB-Jar.xml 中有 EJB,甚至可能不需要注释,我试图在 EAR 中使用 EJB 项目和 jar,用JAX-RS 但显然它不受支持,因为我在这里与 JBoss 人员合作 https://developer.jboss.org/message/972433#972433

看起来你必须有一个用于 JAX-RS 的 servlet 容器,而 EJB 可以有 Web 服务注释这一事实并不意味着他们正在使用一个 servlet 容器——哦,我试过了!此外,这个问答更多地是为了解决A CDI bean that does not explicitly define a scope is @Dependent scoped by default.我挣扎了一段时间的问题,并认为如果他们遇到同样的事情我会帮助其他人。

于 2017-05-24T19:57:13.507 回答