2010-07-04 7 views
0

Сценарий: 1) создать Maven проект уха, создать военный проект внутри 2) добавить beans.xml к войне project`s WEB-INF/ 3) CREAT простой @Steateless бобCDI с EJB 3.1, приварной регистратор на GlassFish v3.0.1

проект - http://drp.ly/1j5C3t

EJB фасоли:

@Stateless 
@LocalBean 
public class TestEjb { 


    @Inject 
    Logger log; 

    public TestEjb() { 
    } 

    @Schedule(hour = "*", minute = "*", second = "*/15") 
    public void print1Partner() { 
     log.info("Yrjaaaa"); 
     System.out.println("This is test"); 

    } 


} 

Maven POM-XML войны проекта:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <parent> 
     <artifactId>Testo</artifactId> 
     <groupId>ua.co.testo</groupId> 
     <version>1.0</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>Testo-web</artifactId> 

    <packaging>war</packaging> 

    <properties> 
     <project.build.sourceEncoding> 
      UTF-8 
     </project.build.sourceEncoding> 

     <project.reporting.outputEncoding> 
      UTF-8 
     </project.reporting.outputEncoding>   
    </properties> 



    <dependencies> 

     <dependency> 
      <groupId>ua.eset.oasys</groupId> 
      <artifactId>utopia</artifactId> 
      <version>1.0</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>ua.eset.oasys</groupId> 
      <artifactId>fenix</artifactId> 
      <version>1.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>--> 



     <dependency> 
      <groupId>javax.faces</groupId> 
      <artifactId>jsf-api</artifactId> 
      <version>2.0.2-FCS</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.faces</groupId> 
      <artifactId>jsf-impl</artifactId> 
      <version>2.0.2-FCS</version> 
      <scope>provided</scope> 
     </dependency> 


     <!--J2EE--> 
     <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> 



     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.servlet</artifactId> 
      <version>3.0</version> 
      <type>jar</type> 
      <scope>provided</scope> 
     </dependency> 


    </dependencies> 

    <build> 
     <finalName>testo-web</finalName> 

     <plugins> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.0.2</version> 
       <configuration> 
        <encoding>utf8</encoding> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 

     </plugins> 
    </build> 

</project> 

Maven pom.xml проекта уха:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <parent> 
     <artifactId>Testo</artifactId> 
     <groupId>ua.co.testo</groupId> 
     <version>1.0</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>Testo-ear</artifactId> 
    <packaging>ear</packaging> 

    <properties> 
     <project.build.sourceEncoding> 
      UTF-8 
     </project.build.sourceEncoding> 

     <project.reporting.outputEncoding> 
      UTF-8 
     </project.reporting.outputEncoding> 

    </properties> 

    <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>--> 

     <dependency> 
      <groupId>ua.co.testo</groupId> 
      <artifactId>Testo-web</artifactId> 
      <version>1.0</version> 
      <type>war</type> 
     </dependency> 


    </dependencies> 

    <build> 
     <finalName>testo</finalName> 
     <plugins> 
      <plugin> 
       <!--<groupId>org.apache.maven.plugins</groupId>--> 
       <artifactId>maven-ear-plugin</artifactId> 
       <version>2.4.1</version> 
       <configuration> 
        <modules> 

         <webModule> 
          <bundleFileName>testo-web.war</bundleFileName> 
          <groupId>ua.co.testo</groupId> 
          <artifactId>Testo-web</artifactId> 
         </webModule> 



         <!--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> 

</project> 

Тестовый пример 1 (Проблема): развертывание проекта с beans.xml дают исключение:

[# | 2010- 07-04T19: 36: 50.003 + 0300 | ПРЕДУПРЕЖДЕНИЕ | oracle-glassfish3.0.1 | javax.enterprise.system.container.ejb.com.sun.ejb.containers | _ThreadID = 33; _ThreadName = Thread-1; | A Исключение произошло во время вызова на E JB TestEjb метод общественного недействительный TestEjb.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) at com.sun.ejb.containers.BaseContainer.callEJBTimeout (BaseContainer.java:3962) at com.sun.ejb.containers.EJBTimerService.deliverTimeout (EJBTimerService.java:1667) на com.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 (Threa dPoolExecutor.java:908) на java.lang.Thread.run (Thread.java:619) причиненном: javax.ejb.EJBException: javax.ejb.CreateException: не удалось создать без гражданства EJB на ком. 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 (StatelessSessionContainer.java:528) на com.sun.ejb.containers.StatelessSessionContainer.access $ 000 (StatelessSessionContainer.java:90) на com.sun.ejb.containers.StatelessSessionContainer $ SessionContextFactory.create (StatelessSessionContainer.java:718) ... 14 более Вызванный: java.lang.NullPointerException на java.util.concurrent.ConcurrentHashMap.get (ConcurrentHashMap.java:768) at org.jboss.weld.manager.BeanManagerImpl.getBean (BeanManagerImpl.java:1171) at o rg.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) на com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB (StatelessSessionContainer.java: 469) ... 16 подробнее | #] [# | 2010-07-04T19: 36: 50.004 + 0300 | INFO | oracle-glassfish3.0.1 | javax.enterprise.system.container.ejb.com.sun.ejb .containers | _ThreadID = 33; _ThreadName = Thread-1; | EJB5119: Исключение таймер ['13 @@ 1278255602087 @@ сервер @@ OASYS' 'TimedObject = TestEjb' 'Application = Testo' 'BEING_DELIVERED' 'PERIODIC' 'Контейнер ID = 83771744647118848' «вс 4 июля 19:36: 45 EEST 2010 '' 0 ' ' */15 # * # * # * # * # # # # # # # # null # null # true # print1Partner # 0 '] после [2] не удалось отправить ##

[# | 2010-07-04T19: 37: 00.000 + 0300 | INFO | oracle-glassfish3.0.1 | javax.enterprise.system.std.com.sun.enterprise.v3.services.impl | _ThreadID = 33; _ThreadName = Thread-1; | Это является тестом | #]

Ожидаемые результаты:

Yrjaaaa

Это испытание

Результаты:

Исключение

Это испытание


кейс 2: удалить бобы.XML

Ожидаемые результаты:

Yrjaaaa

Это тест

результаты

Yrjaaaa

Это испытание

Цель: Я хочу использовать EJB сварки (CDI) в веб-проекте внутри архива уха, который включают в себя некоторые другие войны & EJB проектов, но я надеваю wond отделить мой веб-проекта (война + EJB)

инструменты & среды: Maven & EJB 3.1 & приварку & GlassFish 3.0.1

Q1: есть это может быть какая-то конкретная ошибка в болоте? Q2: что может быть причиной проблемы? Q3: есть ли какой-нибудь дизайн для такого случая?

Спасибо.

ответ

0

выглядит как мы можем t use Injection of weld logger in ejb in a case of glassfish ejb container because of it is ejb container managed bean and it don т см производителю

Текущего дизайн является разделение и EJB войны модуля - в СПИСКЕ вилке для меня.

3

Либо упаковать ваше EJB в пакете .warИЛИ это, как EJB-банка внутри "традиционный" .ear. Я рассматриваю упаковку .war как удобство для проектов без сильных потребностей модуляции. Но это не означает, что правила изменились при использовании упаковки .ear.

Другими словами, я не думаю, что вы можете смешивать оба подхода и не ожидали, что контейнер его поддержит.

В качестве примечания, интересно, почему вы упаковываете cdi-api внутри EAR, я думаю, что API предоставлен контейнером.

На мой взгляд, вы должны стараться, чтобы все было просто.

+0

>> Как примечание стороны, интересно, почему вы упаковываете КДИ-апите внутри EAR, я думаю, что API предоставляется контейнер Это из-за некоторые учебные пособия) - для производства Я использую (ejb-jar (для ejb) и war (fow web + cdi)), но есть реальные некоторые эффекты, которые более естественно для веб-модуля (те, которые используются только веб-модулем). --- Благодарим за отзыв. –

+0

@kislo_metal: Учебники с контейнером Java EE 6? –

+0

@Pascal - Вероятно, это исходит из какой-либо статьи/учебника для контейнеров, таких как tomcat, которые не нужны cdi-api. Я удалил его, спасибо, указав мне на непригодность этой зависимости в случае контейнера j2ee6. –