简体   繁体   English

构造函数注入在 Servlet + WELD + Tomcat 中不起作用

[英]Constructor Injection not working in Servlet + WELD + Tomcat

I have problem with Constructor Injection in CDI.我在 CDI 中遇到构造函数注入问题。 Field or property injection works fine.字段或属性注入工作正常。 Constructor Injection of Field injected instances works fine as well.字段注入实例的构造函数注入也可以正常工作。 The only thing is not working - constructor injection in Servlet Classes.唯一不工作的 - Servlet 类中的构造函数注入。

Configuration: empty beans.xml in WEB-INF, BeanManager defined in context.xml.配置:空beans.WEB-INF中的xml,context中定义的BeanManager.xml。

Environment: Tomcat 9.0.24, CDI, WELD implementation.环境:Tomcat 9.0.24,CDI,WELD 实施。

Example code:示例代码:

@WebServlet(urlPatterns = "/servlet/*")
public class SimpleServlet extends HttpServlet implements Serializable {

// @Inject
private TestService testService;

@Inject
public SimpleServlet(TestService testService) {
    this.testService = testService;
}

// Without this constructor (even protected) I have Exception java.lang.NoSuchMethodException: SimpleServlet.<init>()
public SimpleServlet() {
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // This prints null when using constructor injection
    // Prints instance hashcode when using field injection
    resp.getWriter().write(testService + "");
}

@PostConstruct
public void onPostConstruct() {
    System.out.println("This is invoked everytime");

    // Null when constructor injection
    System.out.println(testService);
}
}

POM.xml POM.xml

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>2.0.SP1</version>
    </dependency>

    <dependency>
        <groupId>org.jboss.weld.servlet</groupId>
        <artifactId>weld-servlet-shaded</artifactId>
        <version>3.1.2.Final</version>
    </dependency>
</dependencies>

StackTrace of ConstructorInjection inside Servlet: Servlet 内 ConstructorInjection 的 StackTrace:

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:151)
at org.jboss.weld.environment.tomcat.ForwardingInstanceManager.newInstance(ForwardingInstanceManager.java:26)
at org.jboss.weld.environment.tomcat.WeldForwardingInstanceManager.newInstance(WeldForwardingInstanceManager.java:71)

And ConstructorInjections inside other class:以及其他 class 内部的 ConstructorInjections:

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:119)
at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:92)
at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:78)

So the WELD inside Servlet use ForwardingIntranceManager, but inside other classes ConstructorInjectionPoint.所以 Servlet 内部的 WELD 使用 ForwardingIntranceManager,但在其他类 ConstructorInjectionPoint 内部。 Bug inside WELD maybe? WELD里面的错误可能吗?

you have already tried downgrading the CDI version?您是否已经尝试过降级 CDI 版本? try changing these dependencies in your pom.xml.尝试在 pom.xml 中更改这些依赖项。


<dependency>
  <groupId>javax.enterprise</groupId>
  <artifactId>cdi-api</artifactId>
  <version>1.2</version>
</dependency>

<dependency>
  <groupId>org.jboss.weld.servlet</groupId>
  <artifactId>weld-servlet</artifactId>
  <version>2.2.9.Final</version>
</dependency>  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM