2012-12-07 51 views
1

我遇到EJB 3.1單例問題。我創建了一個簡單的項目,以查看我是否可以正確實例化它們,但是,由於Glassfish 3.1.2.2長期例外,它看起來像是在做一些錯誤的事情。EJB Singleton問題

我正在使用maven將其編譯爲WAR(沒有web.xml描述符)。我使用jax-rs w/Jersey來處理其他的電話。

它看起來像我不能實例化SingletonA(它嘗試部署應用程序時失敗)。在調用用@PostConstruct標記的方法時,SingletonB不會被注入/創建。

任何幫助,將不勝感激。

這裏是我的POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>MyGroup</groupId> 
<artifactId>myartifact</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>war</packaging> 
<name>myproject</name> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>6.0</version> 
    </dependency> 
</dependencies> 

這裏是RestApp

package main; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

@ApplicationPath("/rest/") 
public class RestApp extends Application { 
} 

這裏是我的SingletonA

package main; 

import javax.annotation.PostConstruct; 
import javax.ejb.DependsOn; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 
import javax.inject.Inject; 


@Singleton 
@Startup 
@DependsOn("SingletonB") 
public class SingletonA { 
    @Inject SingletonB sb; 

    @PostConstruct 
    public void init() 
    { 
     System.out.println("\n\n>In SingletonA's startup\n"); 
     sb.doSomethingCool(); 
    } 

    public String test() 
    { 
     return sb.getIt(); 
    } 
} 

這裏是SingletonB

package main; 

import javax.ejb.Singleton; 


@Singleton 
public class SingletonB { 
    public void doSomethingCool() 
    { 
     System.out.println("\n\n\n>>Singleton B did something cool!\n\n\n"); 
    } 

    public String getIt() 
    { 
     return "my string"; 
    } 
} 

REST服務:

package main; 

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

@Path("") 
@Stateless 
public class RestSvc { 
    @Inject SingletonA sa; 

    @Path("/get") 
    @GET 
    public String asdf() 
    { 
     return sa.test(); 
    } 
} 

最後這裏是從服務器堆棧跟蹤:

[#|2012-12-07T10:21:42.934-0700|SEVERE|glassfish3.1.2|javax.enterprise.system.tools.admin.org.glassfish.deployment.admin|_ThreadID=156;_ThreadName=Thread-2;|Exception while loading the app : javax.ejb.CreateException: Initialization failed for Singleton SingletonA 
javax.ejb.CreateException: Initialization failed for Singleton SingletonA 
     at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:547) 
     at com.sun.ejb.containers.AbstractSingletonContainer.access$100(AbstractSingletonContainer.java:79) 
     at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:719) 
     at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:451) 
     at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:216) 
     at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:177) 
     at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:155) 
     at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:177) 
     at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130) 
     at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) 
     at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:301) 
     at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) 
     at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
     at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389) 
     at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348) 
     at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363) 
     at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085) 
     at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95) 
     at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291) 
     at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259) 
     at org.glassfish.admin.rest.ResourceUtil.runCommand(ResourceUtil.java:214) 
     at org.glassfish.admin.rest.ResourceUtil.runCommand(ResourceUtil.java:207) 
     at org.glassfish.admin.rest.resources.TemplateListOfResource.createResource(TemplateListOfResource.java:148) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
     at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) 
     at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
     at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
     at com.sun.jersey.server.impl.uri.rules.SubLocatorRule.accept(SubLocatorRule.java:134) 
     at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     at com.sun.jersey.server.impl.uri.rules.SubLocatorRule.accept(SubLocatorRule.java:134) 
     at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
     at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
     at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
     at com.sun.jersey.server.impl.container.grizzly.GrizzlyContainer._service(GrizzlyContainer.java:182) 
     at com.sun.jersey.server.impl.container.grizzly.GrizzlyContainer.service(GrizzlyContainer.java:147) 
     at org.glassfish.admin.rest.adapter.RestAdapter.service(RestAdapter.java:148) 
     at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) 
     at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354) 
     at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
     at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) 
     at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 
     at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) 
     at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 
     at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
     at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
     at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
     at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
     at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
     at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
     at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
     at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.NullPointerException 
     at main.SingletonA.init(SingletonA.java:20) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at com.sun.ejb.containers.interceptors.BeanCallbackInterceptor.intercept(InterceptorManager.java:1009) 
     at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:65) 
     at com.sun.ejb.containers.interceptors.CallbackInvocationContext.proceed(CallbackInvocationContext.java:113) 
     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCallback(SystemInterceptorProxy.java:138) 
     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.init(SystemInterceptorProxy.java:120) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:964) 
     at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:65) 
     at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:393) 
     at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:376) 
     at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:538) 
     ... 62 more 
|#] 
+0

嘗試添加一個默認的構造函數到您的EJB。我有一個類似的問題最近它幫助你認爲當沒有構造函數提供時,編譯器會生成一個默認的構造函數。 – Eelke

+0

感謝您的回覆。我將默認的公共構造函數添加到單例中,並將所有\ @Inject註釋更改爲\ @EJB。現在我可以部署我的應用程序,但是在其他應用程序中 - 它不會注入SingletonA。我在/ get rest調用中遇到NullPointerException。 – guitarist809

回答

1

如果您的EJB使用@EJB注入,但沒有使用@注入,它可能意味着你忘了在WEB-INF目錄中添加一個beans.xml文件(甚至是空的)。見http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

+0

有趣。我聽說使用Inject是與EE 6一起使用的方式(我正在使用Inject/EJB來查看可能的異常是否會提供有用的東西)。當我嘗試使用Inject時,我在休息服務中得到一個NPE(SingletonA爲空)。你知道我是否需要另一個單身人士的註釋嗎?我在server.log中的「在SingletonA的啓動中」部署時看到了消息,但由於某些原因,CDI不想注入該實例。 – guitarist809

+0

你有沒有在WEB-INF中放入beans.xml文件? –

+0

感謝您的回覆。對不起 - 我沒看見你這麼說。有沒有一個beans.xml文件的例子?我見過的所有內容都是針對Spring框架的(對於EE6,文件是否相同?)。我一定希望嘗試一下,因爲使用glassfish的依賴關係似乎有點冒失。 – guitarist809

0

答案在於pom的依賴關係。除了猜測,我無法給出任何更多的解釋,但它確實如此。如果有人知道爲什麼這個工作,請留下評論爲什麼。

這是我的新的POM文件(我改變了依賴。刪除了JavaEE的-API V6和使用GlassFish的javax.ejb代替。

有一個在這個項目中沒有web.xml文件或beans.xml的(我曾經讀過與EE 6,這些文件是可選的)

我不能再使用@Inject,所以我所有的注射都改爲@EJB。有了這個,我能夠成功實例化兩個單例,並注入它們沒有問題。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>MyGroup</groupId> 
    <artifactId>myartifact</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>myproject</name> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.2</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.ejb</artifactId> 
      <version>3.1.1</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>jsr311-api</artifactId> 
      <version>1.1.1</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 
</project> 
+0

如果您想要使用CDI,那麼beans.xml文件不是可選的。閱讀我在答覆中發送的鏈接。 –