2013-03-31 30 views
0

当访问注入的服务时,如下所示test()抛出NullPointerException
如果我不注入,但使用BugService的新实例,NPE将在下一步:BugServicegetItems()抛出。
其实我觉得很难理解CDI上的JEE6教程部分,所以我想我错过了一些非常基本的东西。感谢你的帮助。注入服务不断抛出空指针异常

这是Java类:

package hoho.misc; 

import java.io.Serializable; 
import javax.inject.Inject; 
import javax.inject.Named; 
import hoho.service.BugService; 

@Named 
public class Printer implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    BugService bs; 

    public static void main(String[] args) { 
     Printer lPrinter = new Printer(); 
     System.out.println(lPrinter.test()); 
    } 

    public String test(){ 
     String result = bs.getItems().toString(); 
     return result; 
    } 
} 

,并将注入的服务:

package hoho.service; 

import java.util.List; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import hoho.model.generated.Item; 

/** 
* Session Bean implementation class ItemService 
*/ 
@Stateless 
public class BugService { 

    /** 
    * Default constructor. 
    */ 
    public BugService() { 
    } 

    @PersistenceContext 
    EntityManager em; 

    @SuppressWarnings("unchecked") 
    public List<Item> getItems() { 
     return this.em.createQuery(
       "SELECT i FROM Item i") 
       .getResultList(); 
    } 
} 

我的JBoss部署,structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
    <exclusions> 
     <module name="org.jboss.resteasy.resteasy-atom-provider" /> 
     <module name="org.jboss.resteasy.resteasy-cdi" /> 
     <module name="org.jboss.resteasy.resteasy-jaxrs" /> 
     <module name="org.jboss.resteasy.resteasy-jaxb-provider" /> 
     <module name="org.jboss.resteasy.resteasy-jackson-provider" /> 
     <module name="org.jboss.resteasy.resteasy-jsapi" /> 
     <module name="org.jboss.resteasy.resteasy-multipart-provider" /> 
     <module name="org.jboss.resteasy.async-http-servlet-30" /> 
     <module name="org.apache.log4j" /> 
    </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

<!-- 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
     <deployment> 
       <exclusions> 
         <module name="org.jboss.as.jaxrs"/> 
       </exclusions> 
     </deployment> 
</jboss-deployment-structure> 
--> 

这是我的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://docs.jboss.org/cdi/beans_1_0.xsd"> 

</beans> 
+0

如果你手工初始化它,因为在这一点上,它不再是一个管理对象,但一个POJO的EJB将无法正常工作。你有* ejb-jar.xml *打包在EJB jar文件的* META-INF *目录中吗?你还使用了什么App服务器? – kolossus

+0

谢谢你的评论。不,我根本没有'ejb-jar.xml',是不是EJB 3.1的可选项? (哦****我错过了java-ee6标签 - 对不起!)我正在使用JBoss AS 7.1.1。 – Lester

+0

beans.xml如何?你的部署结构是什么? – LightGuard

回答

2

除非JBOSS与我使用(glassfish)的java-ee容器完全不同,否则你不应该尝试使用自制main方法访问bean(因为容器不会在场)。

一个选择是将指定的bean绑定到某个jsf页面,并用一个按钮调用test()。

<h:form> 
    <h:commandButton action="#{printer.test}" value="Add"/> 
</h:form> 

我喜欢this tutorial on jsf-cdi-ejb

+0

啊,我觉得你碰到了阿克塞尔,我错过了。 CDI是一种容器管理技术。你不能使用'new',并期望所有的东西都能为你接线。 – LightGuard

+0

@Aksel谢谢你的回答。你的方式我得到'NPService'在'BugService'的行,代码是'return this.em.createQuery('。 我会查看命名教程并给出一些反馈,它对我的​​帮助/没有帮助问题 – Lester

+0

这意味着EntityManager的注入没有发生,当您部署时,可能在服务器日志中有某些内容? –