2013-01-19 20 views
0

我试图通过一个名为IUserDAO.java的接口注入一个dao类。两个类实现此接口:UserDAO.java,它使用List来管理用户,而UserDAOJPA.java使用一个entitymanager来管理数据库中的用户。声明带有两个可选类的接口给出null

问题是,当我声明接口时,它返回null。当我直接拨打UserDAO时,它可以工作。

这是我的服务类的代码:

@Named(value = "userService") 
@Stateless 
public class UserService{ 

    @Inject 
    private IUserDAO userDAO; 
//apperantly null. If I declare UserDAO instead, it works 

    public UserService() { 
     initUsers(); 
    } 

    public void create(User user) { 
     userDAO.create(user); 
    } 

... 

    userDAO.create(u1); 
    userDAO.create(u2); 
    userDAO.create(u3); 
    userDAO.create(u4); 

我的界面被命名为public interface IUserDAO

类UserDAO的开始是这样的:

@Alternative 
@Stateless 
public class UserDAO implements Serializable, IUserDAO { 

    private List<User> users; 

    public UserDAO() { 
     users = new ArrayList(); 
    } 

而且我UserDAOJPA类开始是这样的:

@Stateless 
@Alternative 
public class UserDAOJPA implements IUserDAO, Serializable{ 

    @PersistenceContext 
    private EntityManager em; 

    public UserDAOJPA() { 

    } 

我让网站决定通过beans.xml文件中使用的类。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

     <alternatives> 
      <class>dao.UserDAO</class> 
     </alternatives> 
</beans> 

我在做什么错或我错过了什么? 错误消息如下:

SEVERE: Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method 
java.lang.RuntimeException: EJB Container initialization error 
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:242) 
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:305) 
    at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:108) 
    at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186) 
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:264) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460) 
    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 com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461) 
    at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212) 
    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 service.userService.initUsers(userService.java:65) 
    at service.userService.<init>(userService.java:21) 
at service.__EJB31_Generated__KwetterService__Intf____Bean__.<init>(Unknown Source) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:372) 
    at java.lang.Class.newInstance(Class.java:325) 
    at com.sun.ejb.containers.BaseContainer.instantiateOptionalEJBLocalBusinessObjectImpl(BaseContainer.java:3887) 
    at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:253) 
    at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:167) 
    at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:230) 
    ... 33 more 
+0

您使用哪个EE容器?日志文件中是否存在可疑内容? – dunni

+0

我在Netbeans中使用GlassFish服务器。它说EJB容器加载失败,并且回溯表示它是由于'userDAO'为空(如果我不使用接口,情况不是这样) – Joetjah

+0

您能否提供完整的日志?当我遇到类似的问题时(尽管是WebSphere),日志中总是有一些关于注入问题的信息。 – dunni

回答

0

显然,上面的代码是正确的。我清理了Glassfish服务器并小睡了一下,当我醒来再次启动时,它几乎奏效了。

相关问题