2012-04-26 90 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的註解的方法,看看它正在創建和銷燬當應用程序啓動時並關閉。