2010-10-01 31 views
11

Sau 2 ngày gỡ lỗi và thử tôi không có ý tưởng nào khác ngoài việc yêu cầu bạn giải pháp.Sử dụng CDI (Hàn) trong Tomcat với các lớp POJO đơn giản

Tôi muốn sử dụng CDI (trên JEE6) trong một Webcat Tomcat chỉ với các đối tượng java đơn giản cũ (chưa). Theo tôi biết, đơn giản là có thể đưa các lớp java POJO vào các lớp Java POJO khác ?!

Dưới đây là các lớp học ví dụ của tôi

  • lớp ToBeInjected (Application-scoped/singleton)
  • lớp InjectingExample
  • ServletListener "ApplicationContextListener"

Các ứng dụng chỉnh phạm vi (singleton) lớp "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!"); 
    } 

} 

Các lớp "InjectingExample" rằng tiêm lớp trên:

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

} 

Cuối cùng đó là ContextListener đó tạo ra một thể hiện của InjectingExample và gọi 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 >>>>>"); 
    } 


} 

Tôi đang sử dụng Tomcat 6 với WEB-INF/web.xml sau:

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

Cuối cùng tôi sao chép "hàn-tomcat-support-1.0.1-Final.jar" đến $ {CATALINA_HOME}/libs.

Triển khai và chạy ứng dụng web trong Tomcat ném NullPointerException vì thành viên "bean" trong lớp InjectingExample là null (không được tiêm).

Theo như tôi đã hiểu, điều này sẽ hiệu quả. Liệu tôi có sai?

Thanx cho sự chú ý của bạn cho đến đây. Hy vọng rằng tôi đã đề cập đến tất cả mọi thứ mà là nhập khẩu cho bạn để giúp tôi. Khác cho chúng tôi biết bạn cần gì.

Cuối cùng đầu ra logfile trong 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

Bạn đã bao giờ tìm thấy câu trả lời cho vấn đề của mình chưa? –

+0

Chưa. Tôi sẽ thử nó trong một vài ngày với một dự án mới - được thiết lập bởi một nguyên mẫu CDI maven. –

Trả lời

6

tôi đã có một cái nhìn nhanh thiết lập mối hàn của bạn trên Tomcat và có vẻ ok (chỉ trong trường hợp, xem 18.3.1. Tomcat để biết chi tiết nếu có yêu cầu) .

Tuy nhiên, tôi có một số câu hỏi/nhận xét:

  • là ARCHIVE CDI của bạn được kích hoạt?Nói cách khác, bạn có tệp beans.xml (đối với ứng dụng web không, tệp beans.xml có thể nằm trong thư mục WEB-INF hoặc trong thư mục WEB-INF/classes/META-INF)? Xem Why is beans.xml required in CDI?

  • Bạn không được phép tự tạo hạt cho mình (như trong new InjectionExample()) nếu bạn muốn CDI của bạn được quản lý bởi CDI. Sử dụng @Inject.


Tôi không thực sự chú ý đến thực tế là bạn đã cố gắng để tiêm một cái gì đó trong một ContextListener, tôi đã được quá nhiều tập trung vào việc sử dụng các nhà điều hành new. Điều đó đang được nói, trong khi tài liệu Weld nêu rõ rằng đặc tả CDI yêu cầu vùng chứa cung cấp tiêm vào tài nguyên không theo ngữ cảnh cho tất cả các lớp thành phần Java EE, tôi hoàn toàn chắc chắn về điều này, đặc biệt khi sử dụng Tomcat.

Cá nhân, tôi sẽ cố gắng để CDI làm việc với Servlet trước (hoặc có thể sử dụng máy chủ Java EE 6 đầy đủ để tránh bất kỳ giới hạn nào).

+0

Có, tôi có một tệp beans.xml trong \ WEB-INF \ classes \ META-INF. Quên đề cập đến điều đó. Và như bạn có thể thấy trong các tệp nhật ký, các lớp của tôi được nhận dạng là các hạt tiêm. –

+0

@Skrrytch Ok, tốt (thực ra, tôi không xem xét kỹ các nhật ký). Tuy nhiên, tôi không nghĩ rằng bạn đang sử dụng toán tử 'new'. –

+0

Nhưng sử dụng nó sẽ không có vấn đề gì, phải không? Tôi cũng đã cố gắng tiêm lớp InjectionExample vào trong ApplicationContextListener với kết quả của một NullPointerException khi gọi sayHello() trên nó: No Injection! –

Các vấn đề liên quan