hi facing problem while moving below code jersey 1.x jersey 2.x
@provider public class localeprovider extends abstracthttpcontextinjectable<locale> implements injectableprovider<context, type> { @override public injectable<e> getinjectable(componentcontext ic, context a, type c) { if (c.equals(locale.class)) { return this; } return null; } @override public componentscope getscope() { return componentscope.perrequest; } @override public locale getvalue(httpcontext c) { final locales locales = c.getrequest().getacceptablelanguages(); if (locales.isempty()) { return locale.us; } return locales.get(0); } } i understand hk2 available in jersey 2.0, cannot seem find docs jersey 2.0 integration.
if you're going use @context annotation, need implement factory<t> parameterized type want inject. can inject other standard injectable objects factory, instance httpservletrequest, containerrequestcontext, httpheaders among others. example, match what's going on in example above
import java.util.list; import java.util.locale; import javax.inject.inject; import javax.ws.rs.core.httpheaders; import org.glassfish.hk2.api.factory; public class localefactory implements factory<locale> { private final httpheaders headers; @inject public localefactory(httpheaders headers) { this.headers = headers; } @override public locale provide() { list<locale> acceptablelanguges = headers.getacceptablelanguages(); if (acceptablelanguges.isempty()) { return locale.us; } if ("*".equals(acceptablelanguges.get(0).tostring())) { return locale.us; } return acceptablelanguges.get(0); } @override public void dispose(locale t) { /* nothing */ } } then need bind factory. example in resourceconfig. can set scope there, in getscope() in example. there support singleton, requestscoped , perlookup (which default if not specified)
@applicationpath("/api") public class appconfig extends resourceconfig { public appconfig() { packages("packages.to.scan"); register(new abstractbinder(){ @override public void configure() { bindfactory(localefactory.class).to(locale.class) .in(requestscoped.class); } }); } } if using web.xml, can create feature , register abstractbinder there, seen here
after this, can inject
@get public response getlocale(@context locale locale) { if want use custom annotation, need implement injectionresolver custom annotation. can see complete example here, , read more in jersey documentation - defining custom injection annotation
Comments
Post a Comment