2010-07-02 3 views
2

용접 로거 주입과 관련하여 몇 가지 문제가 있습니다.glassfish v3.0.1에 배포 된 귀에 CDI가 작동하지 않습니다.

시나리오 : 내부에 ejb-jar가있는 귀가 있습니다. 2010-07-02T19 |

: 25 : 35.003 + 0,300 | 경고 | 오라클 - glassfish3.0.1 print1Partner 내가 예외를 얻었다라고

@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); 
    } 

} 

:

이 내 EJB 빈입니다EJB 파트너 서비스 에서 호출 중에 시스템 예외가 발생했습니다. public void ua.co .oasys.fenix.persistence.PartnersServic e.print1Partner() 에 javax.ejb.EJBException : 에 javax.ejb.EJBException : javax.ejb.CreateException : com.sun.ejb.containers.StatelessSessionContainer._getContext (StatelessSessionContainer.java에서 무 EJB를 만들 수 없습니다 수 : 448 이 com.sun에서 com.sun.ejb.containers.BaseContainer.preInvoke (BaseContainer.java:1860에서) com.sun.ejb.containers.BaseContainer.getContext (BaseContainer.java:2467에서 ) ) .ejb.containers.BaseContainer.callEJBTimeout (BaseContainer.java:3962) at com.sun.ejb.containers.EJBTimerService.deliverTimeout (EJBTimerService.java:1667) at 있는 java.util에서 com.sun.ejb.containers.EJBTimerService $ TaskExpiredWork.run (EJBTimerService.java:2485) 에서 16,com.sun.ejb.containers.EJBTimerService.access $ 50 (EJBTimerService.java:98) . .Executors $ RunnableAdapter.call (Executors.java:441) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303) at java.util.concurrent.FutureTask.run (FutureTask. 자바 : 138) java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) 에서 01,235,164에서 java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) 에서 에 javax.ejb.EJBException :에 의한java.lang.Thread.run (Thread.java:619) javax.ejb.CreateException가 : com.sun.ejb.containers.StatelessSessionContainer의 $에서 무 EJB를 만들 수 없습니다 수 com.sun.ejb.containers.StatelessSessionContainer._getContext에서 SessionContextFactory.create com.sun.ejb.containers.util.pool.NonBlockingPool.getObject (NonBlockingPool.java:200)에서 (StatelessSessionContainer.java:720) (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 com.sun.ejb.containers.StatelessSessionContainer $ SessionContextFactory.create에서 (StatelessSessionContainer.java:90) (StatelessSessionContainer.java:718) ... 14 기타 원인 : 의 java.lang.NullPointerException java.util.concurrent.ConcurrentHashMap.얻을 org.jboss.weld.manager.BeanManagerImpl.getBean에서 org.jboss.weld.manager.BeanManagerImpl.getBean (BeanManagerImpl.java:1171) 에서 (ConcurrentHashMap.java:768) (BeanManagerImpl.java:132) com.sun.ejb에서 org.glassfish.weld.services.JCDIServiceImpl.createJCDIInjectionContext (JCDIServiceImpl.java:122)에서 org.glassfish.weld.services.JCDIServiceImpl._createJCDIInjectionContext (JCDIServiceImpl.java:145) 에서 .containers.BaseContainer.createEjbInstanceAndContext (BaseContainer.java:1616) at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB (StatelessSessionContainer.java:469) ... 16 개 | 사용 #]

:

 <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> 
: EJB 3.1, 글래스 피쉬 3.0.1

받는다는 의존성의 일부

bean.xml in META-INF/

동일한 구성 작업 전쟁 없이는 귀에 전쟁이 일어난다. (전쟁에서 나는 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

용접 (Weld) 로거 및 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!"); 
    } 
} 

난 weld-logger를 사용하여 (바인딩으로 logback을 사용하여) GlassFish 3.0.1에서 코드를 테스트하면 작동합니다.

+0

나는 그들을 ear/lib 디렉토리에 포함시킨다. 업데이트보기 [ear pom.xml] –

+0

Foo가 @Steateless가되어 전쟁 중 내부 패키지에 패키지되어 있으면 작동하는지 확인할 수 있습니까? 감사합니다 –

+0

나는 프로젝트 링크 - http://stackoverflow.com/questions/3175458/cdi-with-ejb-3-1-weld-logger-on-glassfish-v3-0-1에 추가 질문을 넣습니다. –