gpt4 book ai didi

tomcat - 在具有简单 POJO 类的 Tomcat 中使用 CDI(焊接)

转载 作者:行者123 更新时间:2023-11-28 21:45:22 27 4
gpt4 key购买 nike

经过 2 天的调试和尝试,除了向您寻求解决方案外,我别无他法。

我想在 Tomcat WebApp 中使用 CDI(在 JEE6 上),只有简单的普通旧 Java 对象(目前)。据我所知,将 POJO java 类注入(inject)到其他 POJO Java 类中是可能的吗?!

这是我的示例类

  • ToBeInjected 类(应用程序范围/单例)
  • 类注入(inject)示例
  • ServletListener "ApplicationContextListener"

应用程序范围(单例)类“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!");
}

}

注入(inject)上述类的类“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();
}

}

最后是创建 InjectingExample 实例并调用 sayHello() 的 ContextListener:

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>

最后,我将“weld-tomcat-support-1.0.1-Final.jar”复制到 ${CATALINA_HOME}/libs。

在 Tomcat 中部署和运行 webapp 会抛出 NullPointerException,因为类 InjectingExample 中的成员“bean”为 null(未注入(inject))。

据我所知,这应该可行。我错了吗?

感谢您的关注。希望我已经提到了对你来说很重要的一切来帮助我。否则告诉我你需要什么。

最后在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 >>>>> [@]

最佳答案

我快速查看了您在 Tomcat 上的 Weld 设置,它看起来不错(以防万一,如果需要,请参阅 18.3.1. Tomcat 了解详细信息)。

但是,我有一些问题/意见:

  • 您的存档 CDI 是否已启用?换句话说,您是否有 beans.xml 文件(对于 Web 应用程序,beans.xml 文件可以位于 WEB-INF 目录或 WEB-INF/classes/META-INF 目录)?参见 Why is beans.xml required in CDI?

  • 如果您希望您的 bean 由 CDI 管理,则您不应该自己实例化 bean(如在 new InjectionExample() 中)。使用@Inject


我并没有真正注意到您试图在 ContextListener 中注入(inject)一些东西这一事实,我过于关注 new 运算符的使用。话虽如此,虽然 Weld 文档指出CDI 规范要求容器为所有 Java EE 组件类提供对非上下文资源的注入(inject),但我完全确定这涵盖了什么,尤其是当使用 Tomcat。

就个人而言,我会首先尝试让 CDI 与 Servlet 一起工作(或者可能使用成熟的 Java EE 6 服务器以避免任何限制)。

关于tomcat - 在具有简单 POJO 类的 Tomcat 中使用 CDI(焊接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3838217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com