Отвечать:
Большое спасибо всем, кто посмотрел это, но особенно @Andbdrew. Основываясь на его помощи, у меня все работает, код на https://github.com/dabraham02124/injection/tree/feature . Я собираюсь посмотреть, смогу ли я сделать это менее «аннотации творят чудеса», и на самом деле заставить код вызывать другой код, но он работает над веткой «функция».
Оригинальный вопрос:
Я пытаюсь внедрить ресурс в приложение Джерси 2.7. Это не работает. Я получаю следующую ошибку:
2019-04-20 22:06:06,004 ПРЕДУПРЕЖДЕНИЕ [qtp1142020464-16] o.e.j.s.ServletHandler — javax.servlet.ServletException: исключение MultiException имеет 3 исключения. Вот они: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: не было объекта, доступного для внедрения в Injectee(requiredType=StringHolder,parent=EntryPoint,qualifiers={}),position=-1,Optional=false,self= false,unqualified=null,1295211193) 2. java.lang.IllegalArgumentException: при попытке разрешения зависимостей org.sweatshop.injection.EntryPoint были обнаружены ошибки 3. java.lang.IllegalStateException: невозможно выполнить операцию: разрешить на org. потогонная.инъекция.EntryPoint
Например, я следовал всему, что вижу во всех туториалах, но не ограничиваюсь ими;
- https://riptutorial.com/ru/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
Я пробовал добавлять различные аннотации в разных местах, я прочитал все страницы stackoverflow, которые смог найти по этому поводу, и ничего не изменилось.
Минимальный пример можно найти по адресу https://github.com/dabraham02124/injection . В первом коммите нет инъекции, и она работает. Во втором коммите есть инъекции и броски.
Для тех, кто хочет увидеть код на этой странице, я думаю, что важно:
Класс ресурса
@Path("/")
@RequestScoped
public class EntryPoint {
@Inject
public StringHolder stringHolder;
@GET
@Produces(MediaType.TEXT_HTML)
public Response homePage() {
return Response.ok(stringHolder.getString()).build();
}
}
Класс приложения
@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");
}
Внедренный одноэлементный класс
@RequestScoped
public class StringHolder {
private final String string;
public StringHolder(String string) {
this.string = string;
}
public String getString() {
return string;
}
}
Интересно, что журнал показывает, что я вызываю регистр на Binder, но я никогда не вижу доказательств того, что configure
вызывается.
Помощь? Я рву на себе волосы, а я уже лысый...