users@jersey.java.net

[Jersey] Re: _at_Context/_at_Inject not working on interfaces

From: Robert Gacki <robert.gacki_at_contenttrace.org>
Date: Fri, 10 Jun 2016 21:17:32 +0200

Just an advise: You can use constructor injection with @Inject. Not
also makes instantiation dependencies explicit, it also enables you to
have final references to those dependencies.

@Path("/profile")
public class ProfileResource {

  private final UserService userService;

  @Inject
  public DefaultFoo(final UserService userService) {
    checkArgument(userService != null);
    this.userService = userService;
  }

  @GET
  public Response doSomething(final @Context HttpSession session) {
    ....
  }

}

BTW. In my (Dropwizard) applications, it is pretty rare that resource
classes implement interfaces. There are not many usecases, because
resource classes tend to become really hard to abstract. And I count
that as a good thing, because it reduces complexity to a minimum.

Robert


Am Freitag, den 10.06.2016, 12:12 -0600 schrieb Trenton D. Adams:
> Okay, thanks.
>
> On Fri, Jun 10, 2016 at 4:12 AM, Robert Gacki <robert.gacki_at_contenttr
> ace.org> wrote:
> > Hi,
> >
> > the @Inject / @Context annotations are an implementation detail and
> > should not be used to annotate interfaces. So don't expect Jersey
> > to
> > traverse into the class hierarchy to collect those annotations.
> >
> > Robert
> >
> > Am Freitag, den 10.06.2016, 01:35 -0600 schrieb Trenton D. Adams:
> > > I noticed that @Context and @Inject do not work on interfaces. 
> > Is
> > > that intentional?  It works perfectly if I put the annotations on
> > the
> > > member variables themselves.
> > >
> > > I define this on my interface, and it does not get called on the
> > > implementing class.
> > >
> > > On the interface I have...
> > > void setServiceUri(@Context UriInfo serviceUri);
> > >
> > > void setRequest(@Context HttpServletRequest request);
> > >
> > > @Inject
> > > void setSession(HttpSession session);
> > >
> > > On the implementing class I have...
> > > @Override
> > > public void setServiceUri(UriInfo serviceUri)
> > > {
> > >     this.serviceUri = serviceUri;
> > > }
> > >
> > > @Override
> > > public void setRequest(HttpServletRequest request)
> > > {
> > >     this.request = request;
> > > }
> > >
> > > @Override
> > > public void setSession(HttpSession session)
> > > {
> > >     this.session = session;
> > > }
> > >
> > > I set a break point on any of the set methods, and none of them
> > gets
> > > called.
> >