WedX - журнал о программировании и компьютерных науках

инъекция джерси AbstractBinder не вызывает configure

Отвечать:

Большое спасибо всем, кто посмотрел это, но особенно @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

Например, я следовал всему, что вижу во всех туториалах, но не ограничиваюсь ими;

Я пробовал добавлять различные аннотации в разных местах, я прочитал все страницы 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 вызывается.

Помощь? Я рву на себе волосы, а я уже лысый...


  • Можете ли вы собрать минимальный воспроизводимый пример, включая все зависимости, операторы импорта и полный код, который мы можем скопировать-› вставить-> запустить. 21.04.2019
  • Извини, я думал, что сделал это. Минимальный пример можно найти по адресу github.com/dabraham02124/injection . В первом коммите нет инъекции, и она работает. Во втором коммите есть инъекции и броски. В файле readme описано, как собирать, запускать и тестировать. Есть ли что-то, что я пропустил? 22.04.2019
  • Я вижу только 1 коммит в этом проекте 22.04.2019
  • Ой, извините, я не видел эту ссылку. 22.04.2019
  • Вся регистрация должна выполняться внутри конструктора подкласса ResourceConfig, а не в каком-либо методе, который вызывается после построения. Посмотрите, имеет ли это какое-то значение. Также вы должны использовать Jersey AbstractBinder, а не HK2. Посмотрите на операторы импорта. 22.04.2019
  • Мои извинения за коммиты. 22.04.2019

Ответы:


1

Вы можете использовать Feature для этого, как указано в этом ответе (я не смог сделать их первый подход совместимым с вашей версией из трикотажа).

@Provider
public final class StartupListener implements Feature {

    private final ServiceLocator serviceLocator;

    @Inject
    public StartupListener(ServiceLocator serviceLocator) {
        this.serviceLocator = serviceLocator;
    }

    @Override
    public boolean configure(FeatureContext context) {
        ServiceLocatorUtilities.bind(serviceLocator, new AbstractBinder() {
            @Override
            protected void configure() {
                bind(new StringHolder("injected string")).to(StringHolder.class);
            }
        });
        return true;
    }
}
22.04.2019
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]