users@jersey.java.net

[Jersey] Cannot inject into javax.servlet.Filter

From: Stuart Broad <stuart_at_moogsoft.com>
Date: Fri, 15 Apr 2016 11:07:34 -0700

Hi,

This is my first post. I don't have much experience with CDI and Jersey so
I could well be doing something wrong but I have been unable to inject into
a filter and would appreciate any suggestions. I don't think I am using the
package scanning because I have used a ResourceConfig and AbstractBinder
class to explicitly define the class I want to inject but in trying to get
it to work I have defined some packages to scan.

Jersey 2.2
> TomEE WebProfile 1.7.4
> Java 1.8.0_25


I have a EAR file with the following structure:

 |
> |_A.war
> |
> |_B.war
> |
> |_META-INF
> | |
> | |_application.xml
> |
> |_lib
> |
> |_3rdPary Jars
> |
> |_shared.jar


The shared.jar contains the following classes:

package1.Application
> package1.ApplicationBinder
> pacakge1.Test
> package2.MyFilter


The Application class is defined as follows:

import org.glassfish.jersey.server.ResourceConfig;
> public class Application extends ResourceConfig {
> public Application() {
> register(new ApplicationBinder());
> packages(true, "package1", "package2");
> }
> }


 The ApplicationBinder class is defined as follows:

import org.glassfish.hk2.utilities.binding.AbstractBinder;
> import javax.inject.Singleton;
> public class ApplicationBinder extends AbstractBinder {
> @Override
> protected void configure()
> {
> bind(Test.class).to(Test.class).in(Singleton.class);
> }
> }


Each of the WAR files has a web.xml similar to the following:

<?xml version="1.0" encoding="UTF-8"?>
> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
> http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
> version="3.1">
> <servlet>
> <servlet-name>a</servlet-name>
>
> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
> <init-param>
> <param-name>jersey.config.server.provider.packages</param-name>
> <param-value>packageWarA,package1,package2</param-value>
> </init-param>
> <init-param>
> <param-name>javax.ws.rs.Application</param-name>
> <param-value>package1.CCoreApplication</param-value>
> </init-param>
> <load-on-startup>1</load-on-startup>
> </servlet>
> <filter>
> <filter-name>MyFilter</filter-name>
> <filter-class>package2.MyFilter</filter-class>
> </filter>
> <filter-mapping>
> <filter-name>MyFilter</filter-name>
> <servlet-name>a</servlet-name>
> <dispatcher>REQUEST</dispatcher>
> </filter-mapping>
> <servlet-mapping>
> <servlet-name>a</servlet-name>
> <url-pattern>/a/*</url-pattern>
> </servlet-mapping>
> </web-app>


In A.war I have an endpoint as follows:

package a;
> import package1.Test;
> import javax.inject.Inject;
> import javax.ws.rs.GET;
> import javax.ws.rs.Path;
> import javax.ws.rs.Produces;
> import javax.ws.rs.core.MediaType;
> @Path("/a")
> public class AEndpoint {
> @Inject
> private Test mTest;
> @GET
> @Produces(MediaType.TEXT_PLAIN)
> public String getMessage() {
> return "Hello!" + mTest;
> }
> }


This works fine and the Test instance gets injected (Yeah!!!).

But...when I add @Inject onto my filter class (package2.MyFilter) I get the
following exception:

Apr 15, 2016 10:51:39 AM org.apache.catalina.core.StandardContext
> filterStart
> SEVERE: Exception starting filter MyFilter
> javax.enterprise.inject.UnsatisfiedResolutionException: Api type
> [package1.Test] is not found with the qualifiers
> Qualifiers: [@javax.enterprise.inject.Default()]
> for injection into Field Injection Point, field name : mTest, Bean Owner
> : [MyFilter, Name:null, WebBeans Type:DEPENDENT, API
> Types:[javax.servlet.Filter,package1.MyFilter,java.lang.Object],
> Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any]]
> at
> org.apache.webbeans.util.InjectionExceptionUtil.throwUnsatisfiedResolutionException(InjectionExceptionUtil.java:60)
> at
> org.apache.webbeans.container.InjectionResolver.getInjectionPointBean(InjectionResolver.java:250)
> at
> org.apache.webbeans.inject.AbstractInjectable.inject(AbstractInjectable.java:76)
> at
> org.apache.webbeans.inject.InjectableField.doInjection(InjectableField.java:65)
> at
> org.apache.webbeans.portable.InjectionTargetImpl.injectFields(InjectionTargetImpl.java:208)
> at
> org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:194)
> at
> org.apache.webbeans.portable.InjectionTargetImpl.inject(InjectionTargetImpl.java:184)
> at
> org.apache.webbeans.component.AbstractOwbBean.create(AbstractOwbBean.java:125)
> at org.apache.openejb.core.WebContext.newInstance(WebContext.java:138)
> at
> org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:46)
> at
> org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:66)
> at
> org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:61)
> at
> org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
> at
> org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
> at
> org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4908)
> at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5602)
> at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
> at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
> at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
> at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
> at
> org.apache.tomee.catalina.TomcatWebAppBuilder.deployWar(TomcatWebAppBuilder.java:663)
> at
> org.apache.tomee.catalina.TomcatWebAppBuilder.deployWebApps(TomcatWebAppBuilder.java:620)
> at
> org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:800)
> at
> org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:677)
> at
> org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:673)
> at org.apache.openejb.assembler.DeployerEjb.deploy(DeployerEjb.java:247)
> at org.apache.openejb.assembler.DeployerEjb.deploy(DeployerEjb.java:140)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:483)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173)
> at
> org.apache.openejb.security.internal.InternalSecurityInterceptor.invoke(InternalSecurityInterceptor.java:35)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:483)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173)
> at
> org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:181)
> at
> org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:100)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:483)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:192)
> at
> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:173)
> at
> org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85)
> at
> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:227)
> at
> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:194)
> at
> org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:370)
> at
> org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:181)
> at
> org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:344)
> at org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:240)
> at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:104)
> at
> org.apache.openejb.server.httpd.ServerServlet.service(ServerServlet.java:58)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
> at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
> at
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
> at
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
> at
> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
> at
> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at
> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
> at java.lang.Thread.run(Thread.java:745)


Sorry for the long email but any help would be very much appreciated.

Cheers,

Stuart