2015-09-18 4 views
0

У меня есть 4 EJBs:Почему мой Singleton StartUp EJB не вводится или не найден в моем состоянии Stateful Bean?

@Singleton 
@Startup 
@Local 
public class TelegramTable { 

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

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

и

@Stateful 
@Local 
public class ScannerHandler implements GatewayClient { 

Я могу успешно внедрить TelegramTable и TelegramQueue в 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 предполагают, что JsonGatewayClient EJB не найден, но найден объект TelegramTable. И настройки планы TelegramTable и JsonGatewayClient такой же .... (Singleton, StartUp, Местный)

не знаю, если это важно: Использование Glassfish 4.0

Любые предложения?

ответ

1

Если я использую

@EJB(beanName = "JsonGatewayClient") 
GatewayClient jsonGatewayClient; 

в ScannerHandler, чем он работает. Кажется, что i должен использовать GatewayClient Интерфейс. (Может быть, кто-то может объяснить, почему?)

С уважением, Jo

1

В большинстве случаев EJB 3 контейнера зависит от соглашений и вводит один и только существующий EJB 3 осуществления. Это удобно, потому что в подавляющем большинстве случаев у вас есть только одна реализация интерфейса. Поскольку это единственный возможный выбор, дополнительная конфигурация не дает никакого добавленного значения. Это не было бы СУХОЙ.

Но если вы получите дополнительную реализацию интерфейса - этот подход сломается.

@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.) с использованием файла конфигурации XML в EJB-банку.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> 

надежда, что помогает