Jakarta ee 为什么我的单例启动EJB不能在有状态Bean中注入或找到?

Jakarta ee 为什么我的单例启动EJB不能在有状态Bean中注入或找到?,jakarta-ee,dependency-injection,ejb,Jakarta Ee,Dependency Injection,Ejb,我有4个EJB: @Singleton @Startup @Local public class TelegramTable { @Startup @Local @Singleton public class TelegramQueue extends GenericBean { @Singleton @Startup @Local public class JsonGatewayClient extends GenericBean implements GatewayClient { 及

我有4个EJB:

@Singleton
@Startup
@Local
public class TelegramTable {

@Startup
@Local
@Singleton
public class TelegramQueue extends GenericBean {

@Singleton
@Startup
@Local
public class JsonGatewayClient extends GenericBean implements GatewayClient {

我可以成功地将电报表电报队列注入JsonGatewayClient对象或ScannerHandler对象

但是如果尝试将JsonGatewayClient注入到ScannerHandler中,则我的server.log中出现以下异常:

[2015-09-18T20:25:15.077+0200] [glassfish 4.0] [SEVERE] [] [javax.enterprise.system.tools.deployment.dol] [tid: _ThreadID=36 _ThreadName=admin-listener(4)] [timeMillis: 1442600715077] [levelValue: 1000] [[
  Cannot resolve reference Local ejb-ref name=de.topmedicare.websocket.ScannerHandler/jsonGatewayClient,Local 3.x interface =de.topmedicare.websocket.JsonGatewayClient,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session]]

[2015-09-18T20:25:15.077+0200] [glassfish 4.0] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=36 _ThreadName=admin-listener(4)] [timeMillis: 1442600715077] [levelValue: 1000] [[
  Exception while deploying the app [mes-ear]]]

[2015-09-18T20:25:15.077+0200] [glassfish 4.0] [SEVERE] [NCLS-CORE-00026] [javax.enterprise.system.core] [tid: _ThreadID=36 _ThreadName=admin-listener(4)] [timeMillis: 1442600715077] [levelValue: 1000] [[
  Exception during lifecycle processing
java.lang.RuntimeException: Cannot resolve reference Local ejb-ref name=de.topmedicare.websocket.ScannerHandler/jsonGatewayClient,Local 3.x interface =de.topmedicare.websocket.JsonGatewayClient,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session
        at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:374)
        at org.glassfish.ejb.deployment.util.EjbBundleValidator.accept(EjbBundleValidator.java:409)
        at org.glassfish.ejb.deployment.descriptor.EjbDescriptor.visit(EjbDescriptor.java:2823)
        at org.glassfish.ejb.deployment.descriptor.EjbDescriptor.visit(EjbDescriptor.java:2811)
        at org.glassfish.ejb.deployment.util.EjbBundleValidator.accept(EjbBundleValidator.java:115)
        at com.sun.enterprise.deployment.BundleDescriptor.visit(BundleDescriptor.java:621)
        at org.glassfish.ejb.deployment.descriptor.EjbBundleDescriptorImpl.visit(EjbBundleDescriptorImpl.java:757)
        at com.sun.enterprise.deployment.util.ApplicationValidator.accept(ApplicationValidator.java:116)
        at com.sun.enterprise.deployment.BundleDescriptor.visit(BundleDescriptor.java:621)
        at com.sun.enterprise.deployment.archivist.ApplicationArchivist.validate(ApplicationArchivist.java:703)
        at com.sun.enterprise.deployment.archivist.ApplicationArchivist.openWith(ApplicationArchivist.java:248)
        at com.sun.enterprise.deployment.archivist.ApplicationFactory.openWith(ApplicationFactory.java:232)
        at org.glassfish.javaee.core.deployment.DolProvider.processDOL(DolProvider.java:188)
        at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:222)
        at org.glassfish.javaee.core.deployment.DolProvider.load(DolProvider.java:96)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.loadDeployer(ApplicationLifecycle.java:878)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.setupContainerInfos(ApplicationLifecycle.java:818)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:374)
        at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
        at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:360)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
        at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
        at org.glassfish.admin.rest.resources.admin.CommandResource.executeCommand(CommandResource.java:396)
        at org.glassfish.admin.rest.resources.admin.CommandResource.execCommandSimpInMultOut(CommandResource.java:234)
        at sun.reflect.GeneratedMethodAccessor135.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:125)
        at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:91)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:346)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:341)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:224)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
        at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:331)
        at org.glassfish.admin.rest.adapter.JerseyContainerCommandService$3.service(JerseyContainerCommandService.java:165)
        at org.glassfish.admin.rest.adapter.RestAdapter.service(RestAdapter.java:181)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
        at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
        at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
        at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
        at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
        at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
        at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
        at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
        at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
        at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
        at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
        at java.lang.Thread.run(Thread.java:745)
]]

[2015-09-18T20:25:15.081+0200] [glassfish 4.0] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=36 _ThreadName=admin-listener(4)] [timeMillis: 1442600715081] [levelValue: 1000] [[
  Exception while deploying the app [mes-ear] : Cannot resolve reference Local ejb-ref name=de.topmedicare.websocket.ScannerHandler/jsonGatewayClient,Local 3.x interface =de.topmedicare.websocket.JsonGatewayClient,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session]]
server.log中的消息表明未找到JsonGatewayClientEJB,但找到了telegateTable对象。而电报表JsonGatewayClient的设置是相同的。。。。(单例、启动、本地)

不知道这是否重要:使用Glassfish 4.0

有什么建议吗?

如果我使用

@EJB(beanName = "JsonGatewayClient")
GatewayClient jsonGatewayClient;
扫描处理器中时,它的工作效率较低。 看来我必须使用网关客户端界面。(也许有人能解释为什么?)

问候,, 如果我使用

@EJB(beanName = "JsonGatewayClient")
GatewayClient jsonGatewayClient;
扫描处理器中时,它的工作效率较低。 看来我必须使用网关客户端界面。(也许有人能解释为什么?)

问候,, 如果我使用

@EJB(beanName = "JsonGatewayClient")
GatewayClient jsonGatewayClient;
扫描处理器中时,它的工作效率较低。 看来我必须使用网关客户端界面。(也许有人能解释为什么?)

问候,, 如果我使用

@EJB(beanName = "JsonGatewayClient")
GatewayClient jsonGatewayClient;
扫描处理器中时,它的工作效率较低。 看来我必须使用网关客户端界面。(也许有人能解释为什么?)

问候,,
jo

在大多数情况下,ejb3容器依赖于约定并注入唯一的现有ejb3实现。这很方便,因为在绝大多数情况下,一个接口只有一个实现。因为它是唯一可能的选择,额外的配置不会提供任何附加值。不会干的

但是,如果您获得了接口的附加实现,这种方法将中断

@Local
public interface Service {

    public String getMessage();
}

@Stateless
public class DefaultService implements Service {

    public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
服务的任何附加实现都会打破依赖项注入的惯例

@Stateless
public class SpecificService implements Service {
     public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
现在,您有两种选择来解决该问题:
1.)使用注释:

@Stateless
@WebService
public class AnnotatedClient {
    // define the service to use here (static)
    @EJB(beanName="DefaultService")
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
2.)在ejb-jar.XML中使用XML配置文件:

@Stateless
@WebService
public class XMLClient {

    @EJB
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
以及定义要在中使用的实现的XML配置文件

<ejb-name>XMLClientBean</ejb-name>
    <ejb-local-ref>
       <ejb-ref-name>com.example.XMLClientBean/service</ejb-ref-name>
           <local>com.example.service.Service</local>
           <ejb-link>DefaultService</ejb-link>
    </ejb-local-ref>
XMLClientBean
com.example.XMLClientBean/service
com.example.service.service
默认服务

希望这会有所帮助

在大多数情况下,EJB3容器依赖于约定并注入唯一的现有EJB3实现。这很方便,因为在绝大多数情况下,一个接口只有一个实现。因为它是唯一可能的选择,额外的配置不会提供任何附加值。不会干的

但是,如果您获得了接口的附加实现,这种方法将中断

@Local
public interface Service {

    public String getMessage();
}

@Stateless
public class DefaultService implements Service {

    public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
服务的任何附加实现都会打破依赖项注入的惯例

@Stateless
public class SpecificService implements Service {
     public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
现在,您有两种选择来解决该问题:
1.)使用注释:

@Stateless
@WebService
public class AnnotatedClient {
    // define the service to use here (static)
    @EJB(beanName="DefaultService")
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
2.)在ejb-jar.XML中使用XML配置文件:

@Stateless
@WebService
public class XMLClient {

    @EJB
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
以及定义要在中使用的实现的XML配置文件

<ejb-name>XMLClientBean</ejb-name>
    <ejb-local-ref>
       <ejb-ref-name>com.example.XMLClientBean/service</ejb-ref-name>
           <local>com.example.service.Service</local>
           <ejb-link>DefaultService</ejb-link>
    </ejb-local-ref>
XMLClientBean
com.example.XMLClientBean/service
com.example.service.service
默认服务

希望这会有所帮助

在大多数情况下,EJB3容器依赖于约定并注入唯一的现有EJB3实现。这很方便,因为在绝大多数情况下,一个接口只有一个实现。因为它是唯一可能的选择,额外的配置不会提供任何附加值。不会干的

但是,如果您获得了接口的附加实现,这种方法将中断

@Local
public interface Service {

    public String getMessage();
}

@Stateless
public class DefaultService implements Service {

    public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
服务的任何附加实现都会打破依赖项注入的惯例

@Stateless
public class SpecificService implements Service {
     public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
现在,您有两种选择来解决该问题:
1.)使用注释:

@Stateless
@WebService
public class AnnotatedClient {
    // define the service to use here (static)
    @EJB(beanName="DefaultService")
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
2.)在ejb-jar.XML中使用XML配置文件:

@Stateless
@WebService
public class XMLClient {

    @EJB
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
以及定义要在中使用的实现的XML配置文件

<ejb-name>XMLClientBean</ejb-name>
    <ejb-local-ref>
       <ejb-ref-name>com.example.XMLClientBean/service</ejb-ref-name>
           <local>com.example.service.Service</local>
           <ejb-link>DefaultService</ejb-link>
    </ejb-local-ref>
XMLClientBean
com.example.XMLClientBean/service
com.example.service.service
默认服务

希望这会有所帮助

在大多数情况下,EJB3容器依赖于约定并注入唯一的现有EJB3实现。这很方便,因为在绝大多数情况下,一个接口只有一个实现。因为它是唯一可能的选择,额外的配置不会提供任何附加值。不会干的

但是,如果您获得了接口的附加实现,这种方法将中断

@Local
public interface Service {

    public String getMessage();
}

@Stateless
public class DefaultService implements Service {

    public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
服务的任何附加实现都会打破依赖项注入的惯例

@Stateless
public class SpecificService implements Service {
     public String getMessage() {
        return "Hello from: " + this.getClass().getName();
    }
}
现在,您有两种选择来解决该问题:
1.)使用注释:

@Stateless
@WebService
public class AnnotatedClient {
    // define the service to use here (static)
    @EJB(beanName="DefaultService")
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
2.)在ejb-jar.XML中使用XML配置文件:

@Stateless
@WebService
public class XMLClient {

    @EJB
    private Service service;

    public String getHello() {
        return this.service.getMessage();
    }
}
以及定义要在中使用的实现的XML配置文件

<ejb-name>XMLClientBean</ejb-name>
    <ejb-local-ref>
       <ejb-ref-name>com.example.XMLClientBean/service</ejb-ref-name>
           <local>com.example.service.Service</local>
           <ejb-link>DefaultService</ejb-link>
    </ejb-local-ref>
XMLClientBean
com.example.XMLClientBean/service
com.example.service.service
默认服务
希望有帮助