2010-10-01 1 views
11

После 2 дней отладки и тестирования у меня нет другой идеи, кроме как просить вас о решении.Использование CDI (Weld) в Tomcat с помощью простых POJO-классов

Я хочу использовать CDI (на JEE6) в Tomcat WebApp с помощью простых простых старых Java-объектов (пока). Насколько я знаю, просто можно вводить классы Java POJO в другие классы POJO Java ?!

Вот мой пример классы

  • класс ToBeInjected (Application-область действия/синглтон)
  • класс InjectingExample
  • ServletListener "ApplicationContextListener"

Применение области действия (Singleton) класс «ToBeInjected»:

import javax.enterprise.context.ApplicationScoped; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@ApplicationScoped 
public class ToBeInjected { 
    private final Logger log = LoggerFactory.getLogger(ToBeInjected.class); 

    public ExampleBean() { 
    log.info("ToBeInjected init"); 
    } 

    public void sayHello() { 
    log.info("Hello from ToBeInjected!"); 
    } 

} 

класс "InjectingExample", который впрыскивает выше класс:

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

public class InjectingExample { 
    private final Logger log = LoggerFactory.getLogger(InjectingExample.class); 

    @Inject 
    private ExampleBean bean; 

    public InjectionExample() { 
    log.info("InjectingExample init"); 
    } 

    public void sayHello() { 
    log.info("InjectingExample tries to say hello ..."); 
    bean.sayHello(); 
    } 

} 

Наконец, есть ContextListener который создал экземпляр InjectingExample и вызывает SayHello():

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import com.btc.dtv.gw.core.common.log.LogMarker; 

public class ApplicationContextListener implements ServletContextListener { 
    private final Logger log = LoggerFactory.getLogger(ApplicationContextListener.class); 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
    log.info(">>>>> Startup >>>>>"); 
    try { 
     InjectionExample example = new InjectionExample(); 
     example.sayHello(); // uses internally the injected singleton class 
    } 
    catch(Exception ex) { 
     log.error("Error (nothing injected?)", ex); 
    } 
    log.info(">>>>> Startup DONE >>>>>"); 
    } 


} 

Я использую Tomcat 6 со следующими WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

    <listener> 
     <listener-class>com.btc.dtv.gw.ApplicationContextListener</listener-class> 
    </listener> 

    <resource-env-ref> 
     <description>Object factory for the CDI Bean Manager</description> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> 
    </resource-env-ref> 

</web-app> 

И META-INF/context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource name="BeanManager" 
      auth="Container" 
      type="javax.enterprise.inject.spi.BeanManager" 
      factory="org.jboss.weld.resources.ManagerObjectFactory" /> 

    <!-- Uncomment to enable injection into Servlets, Servlet Listeners and Filters in Tomcat --> 
    <Listener className="org.jboss.weld.environment.tomcat.WeldLifecycleListener" /> 

</Context> 

Наконец я скопировал "приварной-поддержка кот-1.0.1-Final.jar" до $ {CATALINA_HOME}/ЛИЭС.

Развертывание и запуск webapp в Tomcat вызывает исключение NullPointerException, поскольку член «bean» в классе InjectingExample имеет значение null (не вводится).

Насколько я понял, это должно сработать. Я ошибаюсь?

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

Наконец выход файл_журнала в cataling.log:

12:05:17.716 [http-8080-1] INFO LOCALIZED org.jboss.weld.Version - WELD-000900 1.0.1 (Final) [@] 
12:05:17.763 [http-8080-1] INFO LOCALIZED org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously. [@] 
12:05:17.888 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000103 Enabled alternatives for Manager 
Enabled alternatives: [] [] 
Registered contexts: [interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.inject.Singleton, interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped] 
Registered beans: 1 
Specialized beans: 0 
: [] [] [@] 
12:05:17.888 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000104 Enabled decorator types for Manager 
Enabled alternatives: [] [] 
Registered contexts: [interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.inject.Singleton, interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped] 
Registered beans: 1 
Specialized beans: 0 
: [] [@] 
12:05:17.888 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000105 Enabled interceptor types for Manager 
Enabled alternatives: [] [] 
Registered contexts: [interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.inject.Singleton, interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped] 
Registered beans: 1 
Specialized beans: 0 
: [] [@] 
12:05:17.888 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000103 Enabled alternatives for Manager 
Enabled alternatives: [] [] 
Registered contexts: [interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.inject.Singleton, interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped] 
Registered beans: 1 
Specialized beans: 0 
: [] [] [@] 
12:05:17.888 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000104 Enabled decorator types for Manager 
Enabled alternatives: [] [] 
Registered contexts: [interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.inject.Singleton, interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped] 
Registered beans: 1 
Specialized beans: 0 
: [] [@] 
12:05:17.888 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000105 Enabled interceptor types for Manager 
Enabled alternatives: [] [] 
Registered contexts: [interface javax.enterprise.context.ConversationScoped, interface javax.enterprise.context.ApplicationScoped, interface javax.inject.Singleton, interface javax.enterprise.context.SessionScoped, interface javax.enterprise.context.Dependent, interface javax.enterprise.context.RequestScoped] 
Registered beans: 1 
Specialized beans: 0 
: [] [@] 
12:05:18.013 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Reflection - WELD-000602 interface javax.enterprise.inject.Default is not declared @Target(TYPE, METHOD) or @Target(TYPE) [@] 
12:05:18.013 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Reflection - WELD-000601 interface javax.inject.Named is missing @Target [@] 
12:05:18.013 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Reflection - WELD-000602 interface javax.enterprise.context.RequestScoped is not declared @Target(TYPE, METHOD) or @Target(TYPE) [@] 
12:05:18.013 [http-8080-1] WARN   org.jboss.interceptor.model.InterceptionTypeRegistry - Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled [@] 
12:05:18.013 [http-8080-1] WARN   org.jboss.interceptor.model.InterceptionTypeRegistry - Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled [@] 
12:05:18.029 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ManagedBean-class org.jboss.weld.conversation.ConversationImpl [@] 
12:05:18.029 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: Built-in implicit javax.event.Event bean [@] 
12:05:18.029 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Reflection - WELD-000602 interface javax.enterprise.context.SessionScoped is not declared @Target(TYPE, METHOD) or @Target(TYPE) [@] 
12:05:18.029 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ManagedBean-class org.jboss.weld.conversation.ServletConversationManager [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ProducerMethod-org.jboss.weld.conversation.ServletConversationManager.method getConversationIdName() [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ManagedBean-class org.jboss.weld.conversation.NumericConversationIdGenerator [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: Built-in implicit javax.inject.Instance bean [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-NewManagedBean-class org.jboss.weld.conversation.ConversationImpl [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: Built-in javax.inject.manager.InjectionPoint bean [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ProducerMethod-org.jboss.weld.conversation.ServletConversationManager.method getConversationTimeoutInMilliseconds() [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-NewManagedBean-class org.jboss.weld.conversation.ServletConversationManager [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ProducerMethod-org.jboss.weld.conversation.ServletConversationManager.method getConversationConcurrentAccessTimeout() [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-NewManagedBean-class org.jboss.weld.conversation.NumericConversationIdGenerator [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Reflection - WELD-000602 interface javax.enterprise.inject.Produces is not declared @Target(TYPE, METHOD) or @Target(TYPE) [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ManagedBean-class org.jboss.weld.servlet.HttpSessionManager [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-NewManagedBean-class org.jboss.weld.servlet.HttpSessionManager [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-weld-ProducerMethod-org.jboss.weld.servlet.HttpSessionManager.method getSession() [@] 
12:05:18.044 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Reflection - WELD-000602 interface javax.enterprise.context.ApplicationScoped is not declared @Target(TYPE, METHOD) or @Target(TYPE) [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-ManagedBean-class com.bsp.app.ToBeInjected [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: Built-in javax.inject.manager.InjectionPoint bean [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-NewManagedBean-class com.bsp.app.services.products.impl.ProductServiceImpl [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-NewManagedBean-class com.bsp.app.ToBeInjected [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: Built-in implicit javax.inject.Instance bean [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-ManagedBean-class com.bsp.app.services.products.impl.ProductServiceImpl [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-NewManagedBean-class com.bsp.app.services.products.ProductServiceModule [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-NewManagedBean-class com.bsp.app.InjectingExample [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-ManagedBean-class com.bsp.app.services.products.ProductServiceModule [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: Built-in implicit javax.event.Event bean [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000106 Bean: org.jboss.weld.bean-flat-ManagedBean-class com.bsp.app.InjectingExample [@] 
12:05:18.091 [http-8080-1] DEBUG LOCALIZED org.jboss.weld.Bootstrap - WELD-000100 Weld initialized. Validating beans [@] 
12:05:18.200 [http-8080-1] INFO TEC com.bsp.app.ApplicationContextListener - >>>>> Startup >>>>> [@] 
12:05:18.200 [http-8080-1] INFO   com.bsp.app.InjectingExample - InjectionExample init [@] 
12:05:18.200 [http-8080-1] INFO   com.bsp.app.InjectingExample - InjectionExample tries to say hello ... [@] 
12:05:18.200 [http-8080-1] ERROR   com.bsp.app.ApplicationContextListener - Error (injection failed?) [@] 
java.lang.NullPointerException 
    at com.bsp.app.InjectingExample.sayHello(InjectingExample.java:21) [InjectingExample.class:na] 
    at com.bsp.app.ApplicationContextListener.contextInitialized(ApplicationContextListener.java:20) [ApplicationContextListener.class:na] 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546) [catalina.jar:6.0.29] 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:905) [catalina.jar:6.0.29] 
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:525) [catalina.jar:6.0.29] 
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1359) [catalina.jar:6.0.29] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.6.0_18] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [na:1.6.0_18] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [na:1.6.0_18] 
    at java.lang.reflect.Method.invoke(Method.java:597) [na:1.6.0_18] 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297) [tomcat-coyote.jar:6.0.29] 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836) [na:1.6.0_18] 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) [na:1.6.0_18] 
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1500) [catalina.jar:6.0.29] 
    at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:670) [catalina.jar:6.0.29] 
    at org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:435) [catalina.jar:6.0.29] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:640) [servlet-api.jar:na] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) [servlet-api.jar:na] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [catalina.jar:6.0.29] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [catalina.jar:6.0.29] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [catalina.jar:6.0.29] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [catalina.jar:6.0.29] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) [catalina.jar:6.0.29] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) [tomcat-coyote.jar:6.0.29] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) [tomcat-coyote.jar:6.0.29] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) [tomcat-coyote.jar:6.0.29] 
    at java.lang.Thread.run(Thread.java:619) [na:1.6.0_18] 
12:05:18.200 [http-8080-1] INFO TEC com.bsp.app.ApplicationContextListener - >>>>> Startup DONE >>>>> [@] 
+1

Вы когда-нибудь находили ответ на свою проблему? –

+0

Пока нет. Я попробую его через несколько дней с новым проектом, созданным архетипом CDN Maven. –

ответ

6

У меня был быстрый взгляд на вашей установке Weld на Tomcat, и это выглядит нормально (на всякий случай, см 18.3.1. Tomcat для деталей, если требуется) ,

Однако, у меня есть некоторые вопросы/замечания:

  • включена ваш архив CDI?Другими словами, у вас есть файл beans.xml (для веб-приложения файл beans.xml может быть в каталоге WEB-INF или в каталоге WEB-INF/classes/META-INF)? См. Why is beans.xml required in CDI?. ..

  • Вы не должны создавать экземпляр beans самостоятельно (например, в new InjectionExample()), если хотите, чтобы ваши бобы управлялись CDI. Используйте @Inject.


Я не обращаю внимание на то, что вы пытались привнести что-то в ContextListener, я был слишком сосредоточен на использовании оператора new. При этом, хотя в документации Weld указывается, что для спецификации CDI требуется, чтобы контейнер обеспечивал впрыскивание в неконтекстные ресурсы для всех классов компонентов Java EE, я полностью уверен в том, что это касается, особенно при использовании Tomcat.

Лично я попытался бы заставить CDI работать с сервлетом в первую очередь (или, возможно, использовать полномасштабный сервер Java EE 6, чтобы избежать каких-либо ограничений).

+0

Да, у меня есть beans.xml в \ WEB-INF \ classes \ META-INF. Забыл упомянуть об этом. И, как вы можете видеть в файлах журнала, мои классы распознаются как инъекционные компоненты. –

+0

@Skrrytch Хорошо, хорошо (на самом деле, я не смотрел внимательно на журналы). Но все же, я не думаю, что вы должны использовать оператора 'new'. –

+0

Но использование этого не должно быть проблемой, не так ли? Я также попытался внедрить класс InjectionExample в ApplicationContextListener с результатом исключения NullPointerException при вызове sayHello() на нем: No Injection! –

Смежные вопросы