2012-12-07 55 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文件不是可选的。阅读我在答复中发送的链接。 –