2012-04-26 60 views
3

我有一个使用RestEasy实现的jax-rs服务,我使用的是Jboss as7,并使用@Signleton注解实现了signleton ejb。 signleton在服务器启动时启动(@startup),我想将它注入到jax-rs使用@EJB。问题是这个类总是空的,我开始迷路了,因为在我看过的每个教程中,这都是他们注入ejb的方式。 我应该使用任何特殊的xml文件吗?我究竟做错了什么?RestEasy @EJB返回null

@Path("/") 
public class Service extends Application{ 
@EJB 
private GlobalStore store; 
public Service(){ 
fromejbstore = store.getSentiment();//null pointer is thrown 
} 
} 

的Signleton EJB是:

@Singleton 
@Startup 
public class GlobalStore { 
Sentiment sentiment; 
@PostConstruct 
public void initialize() { 
//do something 
} 
public Sentiment getSentiment(){return sentiment;} 
} 

回答

1

我有同样的问题,当我从REST服务调用s到EJB。当我注入@EJB时,我得到了空值。当我尝试在服务类中添加@Stateless时,没有任何问题。我认为你可以在你的服务类中添加@Stateless。那么它将没有问题。

0

我想你激活您的JAX-RS走错了路。扩展Application并注释为@ApplicationPath的类是用于激活JAX-RS的Java EE 6“无XML”方法。

@ApplicationPath("/rest") 
public class JaxRsActivator extends Application { 
/* class body intentionally left blank */ 
} 

那么你Service应该是在同一个包状JaxRsActivator但并不需要延长Application

@Path("/test") 
public class Service 
{ 
    @EJB private GlobalStore store; 

    @GET @Path("/test") 
    public String getTime() 
    { 
    boolean test = (store==null); 
    return "Test: "+test; 
    } 
} 

你可以用你的浏览器http://<host>/<context>/rest/test/test测试它。

+2

尽管这不是一个创建服务的好方法,但它并没有被禁止,实际上也是有效的。这不是我的问题服务正在工作ejb引用为null – maxsap 2012-04-27 06:42:11

+0

至少这是'org.jboss.spec.archetypes:jboss-javaee6-ear-webapp-archetype'原型中提出的方法。那么你的问题位于其他地方,注释'@ Singleton','@ Startup'和'@EJB'我的引用不是'null'。 – Thor 2012-04-27 07:13:10

+0

当在调试ejb开始时,我认为这必须做一些包装或resteasy无法找到正确的上下文。 – maxsap 2012-04-27 12:02:17

2

我已经改变了我的代码看起来像这样,避免了注射:

`try{ 
     InitialContext ctx=new InitialContext(); 
     localRef = (myEjb) ctx.lookup("java:global/appName/EjbName"); 
     }catch(NamingException ne){ 
      System.out.println("\n[MyRestService]NamingException: "+ne); 
      ne.printStackTrace(); 
     }` 

找不到@EJB注释不工作的原因,大概这有事情做与RestEasy的。

+0

我成功了:localRef =(myEjb)ctx.lookup(“java:全球/应用耳/应用程序的EJB/EjbName br.com.somestuff.ejbinterfacename“)!; – Al2x 2015-08-18 13:07:37

2

据我所知,在@EJB注释注射的POJO不工作 - 尝试关闭服务类为无状态会话Bean(通过在类级别添加@Stateless注释)和GlobalStore注入应该像一个魅力

在WEB-INF
+0

这应该是对OP问题的评论,因为它不会尝试回答它 – Yaroslav 2012-10-06 13:59:12

-2

附加的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"> 
</beans> 

,并更改类扩展应用:

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

import java.util.HashSet; 
import java.util.Set; 

@ApplicationPath("/rest") 

public class YourApplication extends Application 
{ 
    HashSet<Object> singletons = new HashSet<Object>(); 

    public YourApplication() 
    { 
     getClasses().add(yourOwnClass.class); 
    } 

    @Override 
    public Set<Class<?>> getClasses() 
    { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(); 
     return set; 
    } 

    enter code here 

    @Override 
    public Set<Object> getSingletons() 
    { 
     return singletons; 
    } 
} 
0

上面提供的答案是正确的。将@Stateless添加到服务中,添加服务实现的@Local注释接口,然后在该类中通过将@EJB添加到该接口的引用来访问该无状态bean。在Websphere Liberty Profile上必须做的唯一其他事情是在WEB-INF目录中创建beans.xml文件,以停止该cdi bean上的NPE。

@Stateless 
public class ServiceImpl implements Service { 
    public void doSomething() { 
     System.out.println("I did something"); 
    } 

    @PostConstruct 
    public void postConstruct() { 
     System.out.println("I was just constructed"); 
    } 

    @PreDestroy 
    public void preDestroy() { 
     System.out.println("Arrgg I am being destroyed"); 
    } 
} 

@Local 
public interface Service { 
    public void doSomething(); 
} 


public class Client { 

    @EBJ Service service; 

    public void someMethod() { 
     service.doSomething(); 
    } 
} 

../WEB-INF/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"> 
</beans> 

您可以添加后结构和预销毁bean的注解的方法,看看它正在创建和销毁当应用程序启动时并关闭。