2013-06-20 44 views
4

我在java ee 7(glassfish 4)中使用裝飾器模式。Java EE 7 - @Decorator,@Stateless和@PersistenceContext = nullpointerException

我有這個裝飾

@Decorator 
public class FooIndexer implements FooService { 

    @Inject 
    @Delegate 
    FooService fooService; 

    private Logger logger = Logger.getLogger(FooIndexer.class.getName()); 

    //@Inject 
    //Indexer indexer; 

    @Override 
    public Foo create(Foo foo, boolean index) { 

     fooService.create(foo, index); 

     if (index) { 
      System.out.println("Im in"); 
     } 

     return foo; 
    } 

}

而這個EJB類

@Stateless(name = "fooService") 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
@DeclareRoles({"ADMINISTRATOR", "USER"}) 
public class FooServiceImpl implements FooService { 

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

    @Resource(lookup="java:comp/EJBContext") 
    private SessionContext ctx; 

    /** CRUD **/ 
    @RolesAllowed("ADMINISTRATOR") 
    public Foo create(Foo foo, boolean index) { 

     Principal cp = ctx.getCallerPrincipal(); 

     System.out.println(cp.getName()); 

     em.persist(foo); 

     return foo; 
    } 
} 

當我使用此裝飾圖案,在的EntityManager EJB爲空(無裝飾,一切順利精細)。我supose是因爲裝飾器使用@Inject而不是@EJB註釋(@EJB註釋不能在@Decorator中使用),並且EntityManager沒有被注入。

但是,我能做些什麼來獲得entitymanager將被注入使用@decorator?

謝謝

+0

你在混合概念。 ['@ Decorator'來自CDI管理的bean](http://docs.oracle.com/javaee/6/tutorial/doc/gkhqf.html),而'@ EJB'用於EJB注入。 –

+0

因此,Luiggi門多薩,重複我的提示。我能做些什麼來獲得entitymanager將使用@decorator注入這個代碼? –

+0

@LuiggiMendoza根據CDI 1.1規範,EJB也是一個託管bean。參見[3.1.1節。 CDI 1.1規範的哪些Java類是託管的bean?](http://docs.jboss.org/cdi/spec/1.1/cdi-spec.html#what_classes_are_beans)。 – Oliver

回答

0

嘗試增加你的META-INF一個空的beans.xml,這將激活CDI豆的發現。我和我的項目有類似的問題。

見甲骨文的文檔在這裏:http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

您必須創建一個空的beans.xml文件指示GlassFish應用服務器,你的應用程序是一個CDI應用。這個文件在某些​​情況下可以有內容,但不是像這樣的簡單應用程序。

http://docs.oracle.com/javaee/6/tutorial/doc/gjbju.html#gjcvh

祝你好運!

Alexander Kirilov