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:
- Manejo de ContextInjectionResolver
@Context
- ParamInjectionResolver manejando
@PathParam
,@QueryParam
, ... (a través de sus subclases) - AutowiredInjectResolver manejo
@Autowired
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.