2011-11-17 47 views
3

我想知道爲什麼ejb注入到JAX-RS資源(Restoss在JBoss7上)不起作用。 EJB不是戰爭的一部分,而是它自己的EJB jar,但我認爲這不應該成爲問題。我不得不做ctx.lookups「解決方法」,這不是很好。我錯過了什麼,或者真的不支持像這樣注入EJB?下面的例子是與JBoss工作,但與Glassfish的工作(可悲的是,我得跑我的JBoss應用程序)在JBoss7上的JAX-RS資源中注入EJB

Path("x") 
@RequestScoped 
public class UserResource { 

    @Inject // CDI not working too 
    private Service service1; 
    @EJB 
    private Service service2; 

    private Service service3; 


    @GET 
    @Path("y") 
    public Response authenticate(@Context HttpHeaders headers) { 
     System.out.println("null == " + service1); 
     System.out.println("null == " + service2); 

     service3 = annoyingLookup(Service.class); 
     System.out.println("null != " + service3); 
    } 

    private <T> T annoyingLookup(Class<T> clazz) { 
     ... 
     ctx.lookup("java:app/module/" + classzz.getSimpleName()); 
    } 
+0

那些EJB('Service')無界面視圖,本地界面還是遠程界面? –

+0

無接口視圖(@LocalBean),但它不能與@Local兼容 – d1x

+0

戰爭和ejb-jar是否是EAR的一部分? –

回答

2

爲我工作以下。

的RESTEasy根上下文:

package com.foo.rest; 

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

@ApplicationPath("/rest") 
public class RestServiceLocator extends Application { 

} 

STLS豆:

package com.foo.rest; 

import javax.ejb.EJB; 
import javax.ejb.Local; 
import javax.ejb.LocalBean; 
import javax.ejb.Stateless; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.GET; 
import javax.ws.rs.Produces; 

@Path("/foo") 
@Stateless 
@LocalBean //Note: @Local(FooResource.class) does not let RESTEasy to load EJB! 
public class FooResourceBean implements FooResource { 

    @EJB 
    private FooResourceBean h; // Works! 

    /** 
    * http://localhost:8080/webapp/rest/foo/baa 
    * 
    */ 
    @GET 
    @Path("/baa") 
    @Produces("application/json") 
    @Override 
    public Response baa() { 

     String json = "{ \"baa\" : [ " + 
         "    { \"icon\":\"source1.png\" , \"description\":\"Source 1\" }, " + 
         "    { \"icon\":\"source2.png\" , \"description\":\"Source 2\" }, " + 
         "    { \"icon\":\"source3.png\" , \"description\":\"Source 3\" } " + 
         "   ]}\";"; 

     return Response.ok(json).build(); 
    } 

} 
+0

謝謝你回答企鵝。那麼你的答案看起來和我的例子一樣。除了您正在使用無狀態和LocalBean註釋。我不知道這是否是解決這個問題的正確方法。我不希望我的資源成爲EJB – d1x

+0

這不是,我絕對同意你的看法。 RESTEasy在JBoss 7上存在問題(在JBoss 6上所有的工作都很好),我試圖提供一個可能的解決方案。我寧願自己使用CDI,但它不起作用。 –

+0

再次感謝:-)希望JBoss人將盡快完成CDI工作。 – d1x

0

只需添加

@Stateless 

到JAX-RS資源

@Path("/") 
@Stateless 
public class MainMain 
{  

    @EJB(mappedName = "java:global/optima-wsi/OptimaConfigurator!com.sistemaits.optima.configurator.IOptimaConfigurator") 
    IOptimaConfigurator configurator; 

    --- 
} 
+0

忽略,請參閱CrazyPenguin上一篇關於向JAX-RS資源添加無狀態註釋的評論:) – d1x

+0

mappedName是可怕的。你爲什麼覺得使用它的強迫? –

+0

@Mike它依賴於代碼來自哪裏(關於做ejb注入的所有可能性的例子),這只是一個例子,而不是最佳實踐:) – Tommaso