Responder:
Muchas gracias a todos los que vieron esto, pero especialmente a @Andbdrew. Basado en su ayuda lo tengo funcionando, codifique enhttps://github.com/dabraham02124/injection/tree/feature. Voy a ver si puedo hacer que sea menos "que las anotaciones hagan magia", y que realmente el código llame a otro código, pero está funcionando en la rama "característica".
Pregunta original:
Estoy intentando inyectar un recurso en una aplicación jersey 2.7. No esta funcionando Recibo el siguiente error:
2019-04-20 22: 06: 06,004 WARN [qtp1142020464-16] oejsServletHandler - javax.servlet.ServletException: una MultiException tiene 3 excepciones. Son: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: No había ningún objeto disponible para inyectar en Injectee (requiredType = StringHolder, parent = EntryPoint, qualifiers = {}), position = -1, optional = false, self = false, unqualified = null, 1295211193) 2. java.lang.IllegalArgumentException: al intentar resolver las dependencias de org.sweatshop.injection.EntryPoint se encontraron errores 3. java.lang.IllegalStateException: No se puede realizar la operación: resolver en org. sweatshop.injection.EntryPoint
He seguido todo lo que veo en todos los tutoriales, por ejemplo, pero no me limito a;
- https://riptutorial.com/jersey/example/23632/basic-dependency-injection-using-jersey-s-hk2 .
- https://mjremijan.blogspot.com/2016/09/cdi-inject-beans-into-path-jax-rs.html
- https://jersey.github.io/documentation/2.7/ioc.html
Intenté agregar varias anotaciones en varios lugares, leí todas las páginas de stackoverflow que pude encontrar sobre esto, no veo que cambie nada.
El ejemplo mínimo se puede encontrar en https://github.com/dabraham02124/injection. La primera confirmación no tiene inyección y funciona. La segunda confirmación tiene inyección y lanzamientos.
Para aquellos que quieran ver el código en esta página, aquí están los bits que creo que son importantes:
Clase de recurso
@Path("/")
@RequestScoped
public class EntryPoint {
@Inject
public StringHolder stringHolder;
@GET
@Produces(MediaType.TEXT_HTML)
public Response homePage() {
return Response.ok(stringHolder.getString()).build();
}
}
Clase de aplicación
@ApplicationPath("/")
public class App extends ResourceConfig {
private final MyServer jettyServer;
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class);
public App(MyServer jettyServer) {
this.jettyServer = jettyServer;
}
public static void main(String[] args) throws Exception {
final ServletContextHandler context = getContext();
final MyServer jettyServer = new MyServer(8080, context);
prepJettyServlet(context);
log.info("about to start up");
new App(jettyServer).runServer();
}
private void register() {
log.info("start register");
register(EntryPoint.class);
register(StringHolder.class);
register(new AbstractBinder() {
@Override
protected void configure() {
log.info("start bind singleton"); //These three lines never get called
bind(new StringHolder("injected string")).to(StringHolder.class);
log.info("end bind singleton");
}
});
log.info("end register");
}
Clase singleton inyectado
@RequestScoped
public class StringHolder {
private final String string;
public StringHolder(String string) {
this.string = string;
}
public String getString() {
return string;
}
}
Curiosamente, el registro me muestra llamando al registro en el Binder, pero nunca veo evidencia de que configure
se esté llamando.
¿Ayuda? Me estoy arrancando el pelo y ya estoy calvo ...