2017-04-17 48 views
1

我想要使用EJB来填充列表的小部件存在问题。JSR-352 Batchlet ejb nullPointerException

当我启动该项目,GlassFish的标志错误:

Caught exception executing step: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: java.lang.NullPointerException

Glassfish的版本是4.1.1

我batchlet的代码是:

@Named 
public class getPingStatusBatchlet extends AbstractBatchlet { 


    private static GetPingStatus gps = new GetPingStatus(); 
    private List<Node> nodes = null; 
    @EJB 
    private NodeFacade nodeEJB; 
    @Override 
    public String process() throws NamingException { 

     nodes = nodeEJB.findAll(); 

     for (Node item : nodes) { 
      gps.getPingStatus(item.getIpv4()); 
     } 
     return "COMPLETED"; 
    } 

    @Override 
    public void stop() throws Exception { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

} 

我试图运行应用程序在调试和检查nodeEJB时,它始终保持空值。

你知道我如何使用我的EJB到我的小程序中吗?

感谢您的帮助

Ersch

编辑:

的NodeFacade代码:

@Stateless 
public class NodeFacade extends AbstractFacade<Node> { 

    @PersistenceContext(unitName = "powwoPU") 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public NodeFacade() { 
     super(Node.class); 
    } 

} 

的beans.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<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"/> 

getNetworkStatusB atch.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<job version="1.0" id="getNetworkStatusBatch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/jobXML_1_0.xsd" xmlns="http://xmlns.jcp.org/xml/ns/javaee" > 
    <step id="getNetworkStatusBatchlet"> 
     <batchlet ref="com.powwo.app.batchlet.getPingStatusBatchlet"/> 
    </step> 
</job> 

myBackgroundJobManager.java:

@Singleton 
@Startup 
public class BackgroundJobManager { 

    @Schedule(minute = "*", hour = "*", second = "*/10", persistent = false) 
    public void myBackgroundJobManager() { 
     BatchRuntime.getJobOperator().start("getNetworkStatusBatch", null); 
    } 

} 
+1

请问您可以发布NodeFacade.java的内容 – D00de

+0

嗨,我添加了帖子 – Ersch

+0

应该注入并且不评估为null。你能把你的项目发布到github上吗?你正在使用哪种Glassfish版本? – D00de

回答

1

你需要通过bean的名字(而非类名)JSL引用神器。

所以,你应该有:

<batchlet ref="getPingStatusBatchlet"/>

这对你batchlet的@Named(默认)值相匹配

为了将GlassFish中的批处理工件加载为托管bean,并让CDI引擎执行其他bean的注入,您需要使用此工具。

更多信息: 只是为了保持完整性,我会提到你已经采取了照顾的东西,但别人看后可能没有。

您还需要确保批处理工件被发现为托管bean,您通过使用1.0级beans.xml来处理这个托管bean。在稍后的CDI级别中,可以使用bean发现模式= all,它与1.0 beans.xml一样,或者向批处理工件添加“bean定义批注”,如@Dependent)。

+0

它的工作!非常感谢您的帮助@Scott Kurz – Ersch

相关问题