tutorial jax example java dependency-injection jersey jax-rs

java - jax - Jersey 2.*. Cómo reemplazar InjectableProvider y AbstractHttpContextInjectable de Jersey 1.*



jersey java download (2)

Debe implementar la interfaz InjectionResolver<T> de HK2. Eche un vistazo a las implementaciones existentes que están presentes en el área de trabajo de Jersey:

Una vez que tenga esto, debe extender AbstractBinder desde HK2 y enlazar su InjectionResolver mediante su método #configure() :

public class MyResolverBinder extends AbstractBinder { @Override protected void configure() { bind(MyInjectionResolver.class) .to(new TypeLiteral<InjectionResolver<MyAnnotation>>() {}) .in(Singleton.class); } }

... y registre una instancia de este cuaderno en su clase de aplicación (o vía feature ):

Feature :

public class MyFeature implements Feature { @Override public boolean configure(final FeatureContext context) { context.register(new MyResolverBinder()); return true; } }

Registrar MyFeature en la Application :

public class JaxRsApplication extends Application { @Override public Set<Class<?>> getClasses() { final HashSet<Class<?>> classes = new HashSet<Class<?>>(); classes.add(MyFeature.class); // Register other providers or resources. return classes; } }

registrar MyResolverBinder o Feature en el ResourceConfig

new ResourceConfig() // Register either MyFeature .register(MyFeature.class) // or MyResolverBinder .register(new MyResolverBinder()) // Register other providers or resources .packages("my.package");

Me gustaría crear una clase cuyos objetos se puedan inyectar utilizando la anotación @Context (o, mejor aún, una anotación personalizada para los casos en que necesito pasar un argumento a la anotación) en los métodos de recursos. En Jersey 1. * Habría usado InjectableProvider (en mi caso junto con AbstractHttpContextInjectable ). Lo que estoy tratando de lograr es algo como @Auth [ 1 ] de dropwizard (que usa Jersey 1.7).

Las capacidades de inyección de Jersey fueron reemplazadas por HK2 por lo que sé y no pude encontrar ningún ejemplo de lo que estoy describiendo.

Edición: consulta esta pregunta para ver otros problemas que he encontrado al intentar seguir la guía de Michal.


Proporcionar una implementación de InjectionResolver solo ayuda con la inyección , no cuando se resuelven valores para los parámetros de un método de recursos.

Al menos con Jersey 2.11, debe definir un ValueFactoryProvider anotado con @Provider .

@Provider public class MyValueFactoryProvider implements ValueFactoryProvider { @Inject private MyFactory factory; @Override public Factory<?> getValueFactory(Parameter parameter) { if (parameter.getAnnotation(MyAnnotationParam.class) != null) { return factory; } return null; } @Override public PriorityType getPriority() { return Priority.NORMAL; } }

Si también desea obtener el valor inyectado, por ejemplo, los miembros y los parámetros del constructor, entonces InjectionResolver funciona bien.