NPE в поле @Inject для класса @Singleton - PullRequest
1 голос
/ 10 апреля 2020

Я столкнулся с любопытным сценарием, в котором любая попытка использования CDI для управления синглтоном приводила к сбою независимо от того, какие решения я пробовал, и я даже не уверен на данный момент, является ли это чем-то осуществимым / что готово, поэтому я и публикую здесь причину.

Я постараюсь объяснить, насколько это возможно, текущий сценарий, и я хотел бы знать, может ли мое намерение быть выполнено, и если да, то каким образом, и если нет, есть ли альтернатива «обновлению» экземпляров синглтона в этом банке. Если я пропустил детали / части кода, пожалуйста, дайте мне знать, поскольку это что-то немного необычное, и я этого не сделаю, если предоставлю все необходимое.

Фон :

  • EAP JBoss 7.2 используется в качестве сервера;
  • Один большой проект Maven, родительский файл pom действует только как pom для предоставления зависимостей / конфигураций в maven для всех других подпроектов. , которые имеют тип ejb / ear / war в основном.
  • Пользовательский модуль, используемый в JBoss, который предоставляет ряд зависимостей для некоторых проектов это просто папка, содержащая файлы jar, включая пользовательские файлы jar, которые используются в других проектах.
  • testing-целях-ear.ear , развертываемых в сервер, содержащий проекты testing-ejb и testing-war .
  • Военный проект имеет обеспеченную зависимость от одного из jar файлы из пользовательского модуля (на самом деле баночка просто это подпроект основного проекта), и во время компиляции и выполнения он решался нормально, и проблем не было (по моему мнению, точно так же, как использование зависимостей maven);
  • До сих пор, военный проект вызывал синглтон-экземпляры из этого jar (действуя исключительно как бизнес-логика c) методом getInstance (), и все работало нормально.

Intention :

  • Удаление всех приватных конструкторов / getInstance () из jar для синглтон-классов и аннотирование их с помощью @ Singleton в надежде изменить все вызовы в военном проекте на другой путь с помощью @ Inject вместо использования метода getInstance ().

Предпринятые шаги :

  • Для одного отдельного класса был удален закрытый конструктор getInstance (), создан новый интерфейс для класса, позволяющий отображать только определенные методы, а синглтон-класс реализовывал новый интерфейс и был помечен как w ih аннотация @ Singleton из javax.inject .

  • В военном проекте удалили вызов getInstance () и установите переменную с @ Inject в качестве поля в классе, который его использовал, например:

    @Inject
    private Management managementInterface;
    ...
    void someMethod(){
        managementInterface.performBusinessLogic();
    }
    
  • Это приводило к выбрасыванию NPE при вызове executeSomeBusinessLogi c (), для которого я нашел несколько ответов, поэтому я добавил bean-компоненты. xml в эту банку с discovery-mode = all , пробовал @ Singleton из javax.ejb , но ничто не помогло внедрить этот синглтон.

  • Я довольно долго искал, чтобы понять, как это может быть готово, но большая часть сценария ios, изображенного здесь / на google, связана с меж-ejb-связью между приложениями, развернутыми в одном и том же контейнере, но это не одно и то же: мы пытаемся использовать CDI для внедрения синглтона из файла jar это не проект ejb / war, а простая библиотека java. * 108 2 *

На что следует обратить внимание :

  • Этот синглтон-класс ранее использовался в нескольких проектах ejb / war без проблем, поэтому тот факт, что он был задан как пользовательский модуль в JBoss и как отдельный jar, означает, что на самом деле существует только один экземпляр этого класса для всех вызывающих проектов ejb / war, и мы избегаем типичных проблем загрузки контекста / класса, которые связаны с этот материал.

  • Этот синглтон предоставил довольно много методов, некоторые из которых на самом деле лучше не показывать, поэтому я хотел бы поставить перед ним интерфейс, чтобы вызывающие клиенты имели доступ только к некоторым методам, но не ко всем их.

  • JAR-файл имеет доступ ко многим библиотекам / зависимостям из-за структуры проекта и способа управления зависимостями, поэтому было намерение отказаться от старого способа создания и использования синглетонов и их переноса на что-то более современное.

  • Среда IDE (Intellij) способна разрешать зависимость без проблем, как можно увидеть в следующем приложении, при нажатии синий значок метки ведет к классу, помеченному @ Singleton и реализующему этот интерфейс. dependency being solved by the IDE

Вопрос :

  • Можно ли изменить синглтоны из этого проекта jar из classi c способ использования CDI с сервера? В этом отношении лучше всего использовать аннотации, но если есть другие доступные решения, я открыт для них.
...