2010-07-02 4 views
2

У меня есть некоторые проблемы с использованием впрыска сварщика.CDI не работает в ухе, развернутом до стеклянной рыбы. V3.0.1

Сценарий: У меня есть ухо с ejb-jar внутри.

Это мой EJB боб:

@Stateless 
@LocalBean 
public class PartnersService { 
    @Inject 
    Logger log; 

    @PersistenceContext(unitName = "Utopia") 
    EntityManager em; 

    public PartnersService() { 
    } 

    public OasysPartnerEntity getPartner(long id){ 
     return em.find(OasysPartnerEntity.class, id); 
    } 

    @Schedule(hour = "*", minute = "*", second = "*/15") 
    public void print1Partner(){ 
     System.out.println("This is test"); 
     log.info("This is partner`s email under id 1 = "); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void saveTempPartnerTemp(OasysPartnerTempEntity part){ 
     em.persist(part); 
    } 

} 

когда print1Partner назвал меня исключение:

| 2010-07-02T19: 25: 35,003 + 0300 | ПРЕДУПРЕЖДЕНИЕ | оракул-glassfish3.0.1 | javax.enterprise.system.container.ejb.com.sun.ejb.containers | _ThreadID = 48; _ThreadName = резьба-1; | исключение системы произошло во время вызова на EJB PartnersService метода общественных недействительные ua.co .oasys.fenix.persistence.PartnersServic e.print1Partner() javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: не удалось создать без гражданства EJB на com.sun.ejb.containers.StatelessSessionContainer._getContext (StatelessSessionContainer.java: 448) на com.sun.ejb.containers.BaseContainer.getContext (BaseContainer.java:2467) на com.sun.ejb.containers.BaseContainer.preInvoke (BaseContainer.java:1860) на com.sun .ejb.containers.BaseContainer.callEJBTimeout (BaseContainer.java:3962) at com.sun.ejb.containers.EJBTimerService.deliverTimeout (EJBTimerService.java:1667) atcom.sun.ejb.containers.EJBTimerService.access $ 100 (EJBTimerService.java:98) на com.sun.ejb.containers.EJBTimerService $ TaskExpiredWork.run (EJBTimerService.java:2485) на java.util. concurrent.Executors $ RunnableAdapter.call (Executors.java:441) на java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303) в java.util.concurrent.FutureTask.run (FutureTask. Java: 138) на java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) наjava.lang.Thread.run (Thread.java:619) Вызванный: javax.ejb.EJBException: javax.ejb.CreateException: не удалось создать без гражданства EJB на com.sun.ejb.containers.StatelessSessionContainer $ SessionContextFactory.create (StatelessSessionContainer.java:720) на com.sun.ejb.containers.util.pool.NonBlockingPool.getObject (NonBlockingPool.java:200) на com.sun.ejb.containers.StatelessSessionContainer._getContext (StatelessSessionContainer.java:443) ... 12 более Вызванный: javax.ejb.CreateException: не удалось создать без гражданства EJB на com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB (S tatelessSessionContainer.java:528) на com.sun.ejb.containers.StatelessSessionContainer.access $ 000 (StatelessSessionContainer.java:90) на com.sun.ejb.containers.StatelessSessionContainer $ SessionContextFactory.create (StatelessSessionContainer.java:718) ... 14 more Вызвано: java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.получить (ConcurrentHashMap.java:768) на org.jboss.weld.manager.BeanManagerImpl.getBean (BeanManagerImpl.java:1171) в org.jboss.weld.manager.BeanManagerImpl.getBean (BeanManagerImpl.java:132) на org.glassfish.weld.services.JCDIServiceImpl._createJCDIInjectionContext (JCDIServiceImpl.java:145) на org.glassfish.weld.services.JCDIServiceImpl.createJCDIInjectionContext (JCDIServiceImpl.java:122) в com.sun.ejb .containers.BaseContainer.createEjbInstanceAndContext (BaseContainer.java:1616) at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB (StatelessSessionContainer.java:469) ... 16 более | #]

Использование: EJB 3.1, GlassFish 3.0.1

Некоторые из Maven зависимостей:

 <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>6.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.ejb</artifactId> 
      <version>3.0</version> 
      <scope>provided</scope> 
     </dependency> 
<!-- SL4J API --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.6.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <!-- SLF4J JDK14 Binding --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-jdk14</artifactId> 
      <version>1.6.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <!-- Injectable Weld-Logger --> 
     <dependency> 
      <groupId>org.jboss.weld</groupId> 
      <artifactId>weld-logger</artifactId> 
      <version>1.0.0-CR2</version> 
      <scope>provided</scope> 
     </dependency> 
      <!--CDI--> 
     <dependency> 
      <groupId>javax.enterprise</groupId> 
      <artifactId>cdi-api</artifactId> 
      <scope>provided</scope> 
      <version>1.0-CR4</version> 
     </dependency> 

уха pom.xml

<dependencies> 
.... 
<!--weld--> 
     <!-- SL4J API --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.6.0</version> 
     </dependency> 

     <!-- SLF4J JDK14 Binding --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-jdk14</artifactId> 
      <version>1.6.0</version> 
     </dependency> 

     <!-- Injectable Weld-Logger --> 
     <dependency> 
      <groupId>org.jboss.weld</groupId> 
      <artifactId>weld-logger</artifactId> 
      <version>1.0.0-CR2</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.enterprise</groupId> 
      <artifactId>cdi-api</artifactId> 

      <version>1.0-CR4</version> 
     </dependency> 


    </dependencies> 
<build> 
... 
<configuration> 
        <modules> 
... 
         <!--weld--> 
         <!-- SL4J API --> 
         <jarModule> 
          <groupId>org.slf4j</groupId> 
          <artifactId>slf4j-api</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 

         <!-- SLF4J JDK14 Binding --> 
         <jarModule> 
          <groupId>org.slf4j</groupId> 
          <artifactId>slf4j-jdk14</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 

         <!-- Injectable Weld-Logger --> 
         <jarModule> 
          <groupId>org.jboss.weld</groupId> 
          <artifactId>weld-logger</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 
         <jarModule> 
          <groupId>javax.enterprise</groupId> 
          <artifactId>cdi-api</artifactId> 
          <bundleDir>lib</bundleDir> 
         </jarModule> 

        </modules> 
       </configuration> 
      </plugin> 

     </plugins> 

    </build> 

bean.xml in META-INF/

Такая же конфигурация g с войной в ухе без ejb (на войне, но если я использую ejb в войне и сварке - такое же исключение)

Q1: что не так?

Q2: каковы правила использования сварного шва & ejb 3.1?

+0

Ваш [предыдущий вопрос] (http://stackoverflow.com/questions/3166596/ejb-3-1-in-war-package-in-web-inf -classes-javax-ejb-createexception-could-not) разрешено? Если это не так, я постараюсь сначала решить ее, прежде чем вводить дополнительную сложность. –

ответ

0

Наплавленный Logger и SFLF4J артефакты НЕ при условии, если вы хотите использовать их, вам нужно добавить их в приложение:

<!-- SL4J API --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.6.0</version> 
</dependency> 

<!-- SLF4J JDK14 Binding --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-jdk14</artifactId> 
    <version>1.6.0</version> 
</dependency> 

<!-- Injectable Weld-Logger --> 
<dependency> 
    <groupId>org.jboss.weld</groupId> 
    <artifactId>weld-logger</artifactId> 
    <version>1.0.0-CR2</version> 
</dependency> 

Тогда

import javax.inject.Inject; 
import org.slf4j.Logger; 

public class Foo { 
    @Inject 
    private Logger logger; 

    public void bar() { 
     logger.info("Look ma, I'm using an injected Logger!"); 
    } 
} 

Я используя сам журнал сварки (с записью как обязательный) и проверил ваш код под GlassFish 3.0.1, он просто работает.

+0

Я включаю их в каталог ушей/библиотеки. см. Обновление [ухо pom.xml] –

+0

вы могли бы проверить, работает ли он, если Foo становится @ безграничным и упакован в войну внутри пакета уха? Спасибо –

+0

Я добавляю вопрос с вопросом с ссылкой на проект http://-stackoverflow.com/questions/3175458/cdi-with-ejb-3-1-weld-logger-on-glassfish-v3-0-1 –