1

I have created a custom annotation to inject query parameters into my JAXB-generated classes:

public final class ProjectsQueryParamValueFactoryProvider extends AbstractValueFactoryProvider {

    @Inject
    private ServiceLocator locator;

    @Singleton
    static final class InjectionResolver extends ParamInjectionResolver<ProjectsQueryParam> {

        public InjectionResolver() {
            super(ProjectsQueryParamValueFactoryProvider.class);
        }
    }

    private final static class ProjectsQueryParamValueFactory extends
            AbstractContainerRequestValueFactory<ProjectsQuery> {

        private final ServiceLocator locator;
        private final Parameter parameter;

        private ProjectsQueryParamValueFactory(ServiceLocator locator, Parameter parameter) {
            this.locator = locator;
            this.parameter = parameter;
        }

        @Override
        public ProjectsQuery provide() {
            // TODO Auto-generated method stub
            return new ProjectsQuery();
        }

    }

    @Inject
    public ProjectsQueryParamValueFactoryProvider(MultivaluedParameterExtractorProvider mpep,
            ServiceLocator locator, Source[] compatibleSources) {
        super(mpep, locator, compatibleSources);
    }

    @Override
    public Factory<?> createValueFactory(Parameter parameter) {
        Class<?> classType = parameter.getRawType();

        if (classType == null || (!classType.equals(ProjectsQuery.class))) {
            return null;
        }

        return new ProjectsQueryParamValueFactory(locator, parameter);
    }

}

Added the binder:

public class ProjectsQueryParamBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(ProjectsQueryParamValueFactoryProvider.class).to(ValueFactoryProvider.class).in(
                Singleton.class);

        bind(ProjectsQueryParamValueFactoryProvider.InjectionResolver.class).to(
                new TypeLiteral<InjectionResolver<ProjectsQueryParam>>() {
                }).in(Singleton.class);
        bind(Parameter.Source.class).to(Parameter.Source.class);
    }

}

and registered that in my app:

public MyApplication(){
    packages("org.glassfish.jersey.server.spring", "my.package");
    register(new ProjectsQueryParamBinder());
}

Unfortunately, HK2 gives me:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=Parameter$Source;,parent=ProjectsQueryParamValueFactoryProvider,qualifiers={}),position=2,optional=false,self=false,unqualified=null,4924537)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)

web.xml

<servlet>
    <servlet-name>jaxrs-servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.MyApplication</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jaxrs-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

I have read the source code of the Jersey-provived annatations, they all look like my code. Same do the binders. Where is the error? I am confused and lost here.

I have read this and that too, no avail.

Community
  • 1
  • 1
Michael-O
  • 18,123
  • 6
  • 55
  • 121
  • I wonder if this has to do with the fact that you are passing an array of Source to your constructor. What happens if you instead pass IterableProvider instead? – jwells131313 Aug 02 '14 at 12:13
  • I asked this myself but if you look at the [Jersey source](https://github.com/jersey/jersey/blob/master/core-server/src/main/java/org/glassfish/jersey/server/internal/inject/QueryParamValueFactoryProvider.java#L104) it does the same way. – Michael-O Aug 02 '14 at 12:26

0 Answers0