users@jersey.java.net

Re: [Jersey] Missing dependency for constructor

From: Paul Sandoz <Paul.Sandoz_at_oracle.com>
Date: Wed, 11 Aug 2010 11:10:33 +0200

Hi Jared,

For 1.3 i turned on error checking for missing dependencies rather
than injecting null values.

Since you are implementing two types of components, an Exception and
an ExceptionMapper in one class:

@Provider
public class AuthenticationException extends Exception
    implements ExceptionMapper<AuthenticationException> {

    public AuthenticationException(String message) {super(message);}

    public AuthenticationException(String message, Throwable cause) {

    }
}

when Jersey tries to instantiate the AuthenticationException class as
an ExceptionMapper it does not know how to resolve the dependency to
the constructor parameter, what value for the String should be passed?

The workaround is to split your class into two.

For example:

public class AuthenticationException extends Exception {
}

@Provider
public class AuthenticationExceptionMapper extends
ExceptionMapper<AuthenticationException> {
}

or if you want to keep them together do this:

public class AuthenticationException extends Exception {
   @Provider
   public static class AuthenticationExceptionMapper extends
ExceptionMapper<AuthenticationException> {
   }
}

Paul.

On Aug 10, 2010, at 7:42 PM, Jared Nedzel wrote:

> I'm porting some code that works on jersey 1.0.3.1 to jersey 1.3.
>
> When I run it using jersey 1.3, it fails with the following stack
> trace:
>
> Aug 10, 2010 1:31:48 PM org.genomespace.util.server.Main startServer
> INFO: starting grizzly...
> Aug 10, 2010 1:31:49 PM com.sun.grizzly.Controller logVersion
> INFO: Starting Grizzly Framework 1.9.18-i - Tue Aug 10 13:31:49 EDT
> 2010
> Aug 10, 2010 1:31:49 PM org.genomespace.util.server.Main startServer
> INFO: grizzly started
> Aug 10, 2010 1:31:49 PM org.genomespace.util.server.Main main
> INFO: server running at https://localhost:8444/; hit return to stop
> Aug 10, 2010 1:31:57 PM
> com.sun.jersey.api.core.PackagesResourceConfig init
> INFO: Scanning for root resource and provider classes in the packages:
> org.genomespace.system
> Aug 10, 2010 1:31:57 PM
> com.sun.jersey.api.core.ScanningResourceConfig logClasses
> INFO: Root resource classes found:
> class org.genomespace.system.jerseytest.UserResource
> Aug 10, 2010 1:31:57 PM
> com.sun.jersey.api.core.ScanningResourceConfig logClasses
> INFO: Provider classes found:
> class org.genomespace.system.messaging.handler.SecurityFilter
> class
> org.genomespace.system.messaging.handler.AuthenticationException
> Aug 10, 2010 1:31:57 PM
> com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
> INFO: Initiating Jersey application, version 'Jersey: 1.3 06/17/2010
> 04:53 PM'
> Aug 10, 2010 1:31:57 PM com.sun.jersey.spi.inject.Errors
> processErrorMessages
> SEVERE: The following errors and warnings have been detected with
> resource and/or provider classes:
> SEVERE: Missing dependency for constructor public
> org
> .genomespace
> .system.messaging.handler.AuthenticationException(java.lang.String)
> at parameter index 0
> Aug 10, 2010 1:31:57 PM com.sun.grizzly.http.servlet.ServletAdapter
> doService
> SEVERE: service exception:
> com.sun.jersey.spi.inject.Errors$ErrorMessagesException
> at
> com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:150)
> at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:117)
> at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:
> 183)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application.WebApplicationImpl.initiate(WebApplicationImpl.java:649)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application.WebApplicationImpl.initiate(WebApplicationImpl.java:644)
> at
> com
> .sun
> .jersey
> .spi
> .container.servlet.ServletContainer.initiate(ServletContainer.java:
> 428)
> at com.sun.jersey.spi.container.servlet.ServletContainer
> $InternalWebComponent.initiate(ServletContainer.java:277)
> at
> com
> .sun
> .jersey.spi.container.servlet.WebComponent.load(WebComponent.java:573)
> at
> com
> .sun
> .jersey.spi.container.servlet.WebComponent.init(WebComponent.java:211)
> at
> com
> .sun
> .jersey
> .spi.container.servlet.ServletContainer.init(ServletContainer.java:
> 332)
> at
> com
> .sun
> .jersey
> .spi.container.servlet.ServletContainer.init(ServletContainer.java:
> 496)
> at javax.servlet.GenericServlet.init(GenericServlet.java:241)
> at
> com
> .sun
> .grizzly.http.servlet.ServletAdapter.loadServlet(ServletAdapter.java:
> 428)
> at
> com
> .sun
> .grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:
> 367)
> at
> com
> .sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:
> 324)
> at
> com
> .sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:
> 166)
> at
> com
> .sun
> .grizzly
> .tcp.http11.GrizzlyAdapterChain.service(GrizzlyAdapterChain.java:180)
> at
> com
> .sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:
> 166)
> at
> com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:
> 791)
> at
> com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
> at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:
> 954)
> at
> com
> .sun
> .grizzly
> .http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
> at
> com
> .sun
> .grizzly
> .DefaultProtocolChain
> .executeProtocolFilter(DefaultProtocolChain.java:135)
> at
> com
> .sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:
> 102)
> at
> com
> .sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:
> 88)
> at
> com
> .sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
> at
> com
> .sun
> .grizzly
> .ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
> at
> com
> .sun
> .grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
> at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
> at com.sun.grizzly.util.AbstractThreadPool
> $Worker.doWork(AbstractThreadPool.java:330)
> at com.sun.grizzly.util.AbstractThreadPool
> $Worker.run(AbstractThreadPool.java:309)
> at java.lang.Thread.run(Thread.java:637)
>
> The code in question is as follows:
>
> package org.genomespace.system.messaging.handler;
>
> import javax.ws.rs.core.Response;
> import javax.ws.rs.core.Response.Status;
> import javax.ws.rs.ext.ExceptionMapper;
> import javax.ws.rs.ext.Provider;
>
> @Provider
> public class AuthenticationException extends Exception
> implements ExceptionMapper<AuthenticationException> {
>
> public AuthenticationException(String message) {super(message);}
>
> public AuthenticationException(String message, Throwable cause) {
>
> }
>
> @Override
> public Response toResponse(AuthenticationException e) {
> return Response.status(Status.UNAUTHORIZED)
> .header("WWW-Authenticate",
> "X-GSToken realm=\"GenomeSpace Server\"")
> .type("text/plain").entity(e.getMessage()).build();
> }
> }
>
> Any ideas?
>
> Thanks,
>
> Jared Nedzel
> Broad Institute
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>