当前位置: 首页 > 知识库问答 >
问题:

Apache OpenWebBeans(CDI) Servlet,注入不起作用

葛海阳
2023-03-14

我试图让CDI在tomcat 9.x中工作。我遵循了以下链接,但openwebbeans容器仍然没有将资源注入servlet

https://devlearnings.wordpress.com/2011/05/15/apache-openwebbeans-cdi-from-standalone-to-webapp/https://dzone.com/articles/using-apache-openwebbeanshttp://openwebbeans.apache.org/owbsetup_ee.html

下面是我的servlet

package com.openwebbeans;

import java.io.IOException;

import javax.inject.Inject;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SampleController extends  HttpServlet{

    private static final long serialVersionUID = 1L;

    @Inject
    private SampleService service;

    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException {

        response.getWriter().print(service);
    }
}

下面是网络.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>OpenWebBeans</display-name>

    <listener>
        <listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>sample</servlet-name>
        <servlet-class>com.openwebbeans.SampleController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <url-pattern>/sample</url-pattern>
    </servlet-mapping>
</web-app>

在server.xml中添加了以下行

<Listener className="org.apache.webbeans.web.tomcat7.ContextLifecycleListener" />

下面是我的pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.openwebbeans</groupId>
    <artifactId>openwebbeans-beginner</artifactId>
    <packaging>war</packaging>
    <version>1.0</version>
    <name>openwebbeans-beginner</name>
    <url>http://maven.apache.org</url>
    <properties>
        <owb.version>2.0.0</owb.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-atinject_1.0_spec</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jcdi_2.0_spec</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-interceptor_1.2_spec</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-annotation_1.3_spec</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-impl</artifactId>
            <version>${owb.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-spi</artifactId>
            <version>${owb.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-web</artifactId>
            <version>${owb.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-tomcat7</artifactId>
            <version>${owb.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.21.0-GA</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>openwebbeans-beginner</finalName>
    </build>
</project>

在tomcat lib下添加了以下罐子

  • geronimo-annotation_1.3_spec-1.0
  • geronimo-atinject_1.0_spec-1.0
  • geronimo-interceptor_1.2_spec-1.0
  • geronimo-jcdi_2.0_spec-1.0
  • openwebbeans-el22-2.0.0
  • openwebbeans-impl-2.0.0
  • openwebbeans-spi-2.0.0
  • openwebbeans-tomcat7-2.0.0
  • openwebbeans-web-2.0.0
  • xbean-asm5-shaded-4.5
  • xbean-finder-shaded-4.5
  • javassist-3.21.0-GA

以下是部署我的战争后的服务器日志。从日志中可以清楚地看出,打开 Web Bean 容器已启动

20-Jul-2017 10:06:08.315 INFO[超文本传输协议-nio-8080-exec-5]org.apache.catalina.startup.HostConfig.deployWAR部署Web应用程序存档[D:\krishna\apache-tomcat-9.0.0。M22\webapps\openwebbeans-beginner.war] 20-Jul-2017 10:06:08.904 INFO[超文本传输协议-nio-8080-exec-5]org.apache.webbeans.lifecycle.AbstractLifeCycle.bootstrapApplicationOpenWebBeans Container正在启动...20-Jul-2017 10:06:09.229 INFO[超文本传输协议-nio-8080-exec-5]org.apache.webbeans.lifecycle.AbstractLifeCycle.bootstrapApplicationOpenWebBeans Container已启动,耗时[325]ms。20-Jul-2017 10:06:09.235 INFO[超文本传输协议-nio-8080-exec-5]org.apache.catalina.startup.HostConfig.deployWARWeb应用程序存档的部署[D:\krishna\apache-tomcat-9.0.0。M22\webapps\openwebbeans-beginner.war]已在[920]ms内完成

此外,我还创建了openwebbeans。META-INF/openwebbeans下的属性,并添加了org.apache.webbeans.spi.ContainerLifecycle=org.apach.webBeains.lifecycle。独立于此。但它仍然不起作用

我还尝试了org . Apache . web beans . SPI . container life cycle = org . Apache . web beans . web . life cycle . webcontainer life cycle,但似乎都不起作用。

任何人都可以帮我让它工作吗?

共有1个答案

程毅
2023-03-14

如果您需要在servlet中进行注入,那么您需要比servlet侦听器更深入的集成。我们通过openwebbeans-tomcat7插件提供了这一功能

最简单的方法是使用我们的安装程序,如我们的公告邮件 https://lists.apache.org/thread.html/15b8cbcdbcc24942dae6d277d75363103a9d45d59047fda0e6abcbbe@

在这种情况下,只需从您的Web.xml中删除整个WebBeansConfigurationListener。如果您希望集成到“无pimped”servlet容器中,或者如果您在GAE中运行,则这是为了进行。在这种情况下,您可以使用 CDI.current() 在 Servlet 中获取 CDI bean。

您也不再需要任何javassist依赖项。很久以前在OWB 1.2 . x中就被删除了。

请随时ping我们的邮件列表或freenode.net的# openwebbeans IRC!

哦,还有另一个提示:你可以试试我们的Apache Meecrowave容器,它是OWB Tomcat 9 CXF Johnzon——全部在9MB内。它包括一个maven插件,一个Arquillian容器,等等。

 类似资料:
  • 文件src/main/webapp/WEB-INF/web.xml包含用于引导CDI的servlet侦听器和BeanManager引用: 通过这些设置,在使用mvn Jetty运行应用程序时,我总是遇到以下错误:run(第一行是最重要的): 应用程序正在运行,但正如异常消息所述:CDI注入在servlet中不可用。 在src/main/resources/log4j.properties中,我增加

  • 我已经创建了一个CDI(WELD)拦截器,它可以工作并拦截它应该拦截的内容。 其中MyInterceptorBinding是一个拦截器绑定: 我想将我的拦截器注入一个bean类,如下所示: 但是这个注入带来了一个错误: 我如何克服这个问题?问题是否与拦截器的事实有关?我应该使用CDI便携式扩展设施吗?如果是,如何解决?

  • 我想在注射过程中给CDI中的pojo bean一个移动范围。 我创建了一个普通的bean,并在托管Bean中注入了与相同的内容: //POJO类 当我使用相同的语法注入时,Pojo bean的填充值无法在新视图bean中恢复。 但是当我在类声明中使用时,它会起作用,然后是非作用域注入,如下所示: 注射: 前一种情况在我做制片人和资格赛时得到了解决,但我觉得这将是一种我不应该做的开销。作为CDI的新

  • 问题内容: 当前,我正在使用PersistenceContext注入EntityManager。EM被完美注入。 现在,我尝试装饰Bean,然后突然没有注入em。我得到一个NullPointerException。 我知道EJB和CDI是2个完全不同的管理器,所以一个都不知道另一个。我期望@PersistenceContext是EJB注入点,而@Inject是CDI。我应该怎么做才能解决这个问题并

  • 我正在使用Mockito测试我的spring项目,但是似乎无法将一个模拟服务注入到另一个spring服务(bean)中。 下面是我想测试的spring服务: 下面是我要嘲弄的服务: 我的测试代码在这里: 但结果是 似乎CreateMailboxService没有得到模拟的UserInfoService而是使用了spring的autowired Bean。为什么我的不能工作?

  • 我试图从书中创建一个简单的servlet,但没有用。 我使用GlassFish服务器开源版本3.1.2.2、jdk1.7.0_10和记事本。 root\WEB-INF\classes\net\ensode\glassfishbook\formhandling\FormHandlerServlet.class : root/web.xml: root/dataentry.html: 我在控制台中通过