BeanManager не является boud в этом контексте

#java #tomcat #cdi #weld #bean-manager

#java #tomcat #cdi #сварка #bean-manager

Вопрос:

Мы стали владельцами веб-приложения Java, которое в настоящее время выполняется в WebLogic. Сейчас мы пытаемся развернуть это в Tomcat, используя OCP.

Когда мы отбрасываем .файл войны в каталоге Tomcat / webapps, приложение не запустилось, и ошибка, которую мы получили, была:

 10/06/20 13:33:02.405 [                        main] ERROR  ConversationAwarePrimeResourceHandler[72] = 
javax.naming.NameNotFoundException: Name [BeanManager] is not bound in this Context. Unable to find [BeanManager].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:817)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:159)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:827)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at pax.XXXNameRemovedXXX.common.web.servlet.ConversationAwarePrimeResourceHandler.getBeanManager(ConversationAwarePrimeResourceHandler.java:60)
    at pax.XXXNameRemovedXXX.common.web.servlet.ConversationAwarePrimeResourceHandler.<init>(ConversationAwarePrimeResourceHandler.java:33)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  

Ошибка возникла не из веб-приложения, а из «пользовательского» файла .jar, который был создан как часть приложения. Похоже, что тот код, который использовался при создании файла jar, не смог получить BeanManager.

Я нашел инструкцию о том, как это сделать для веб-приложения: серверы приложений и среды, поддерживаемые Weld

Однако, похоже, это не работает для кода, который генерирует файл .jar. В этом коде отсутствуют такие вещи, как META-INF, WEB-INF и т.д.

Может кто-нибудь сказать мне, как мне нужно будет подойти к этому?

Комментарии:

1. WebLogic — это сервер JEE. Tomcat не является сервером JEE. Это servletcontainer. В Tomcat отсутствует не только CDI / Weld по сравнению с обычным сервером JEE. JEE предлагает так много других API, которые полностью отсутствуют в Tomcat. Почему именно вы сделали такой большой шаг назад? Почему бы просто не перейти на обычный сервер JEE, такой как WildFly / TomEE / Payara / etc?

2. Привет. Спасибо за комментарий. Короче говоря, мы переходим на red hat OCP. Обычно мы используем там изображение Tomcat. Кроме того, я не знаком с Weld или CDI. Я нашел инструкции о том, как использовать его в Tomcat, и я следовал им. Не работает. Я также пробовал Tomee, но получил другой набор ошибок, поэтому я вернулся к Tomcat. Приложение было написано другой командой и было передано нам недавно. Будет ли лучше перейти на Tomee и попытаться устранить ошибки там? спасибо!

3. TomEE также является сервером JEE, хотя внутри он использует совершенно другие реализации по сравнению с WebLogic: arjan-tijms.omnifaces.org/2020/05/… Он должен нормально компилироваться (потому что это JEE), но для выполнения потребуется некоторое тестирование (потому что impls могут иметь свой собственный набор ошибок, не найденных в других impls). Так что вам действительно может понадобиться доработать биты в этой области (но вам абсолютно не нужно самостоятельно предоставлять отдельные JEE-имплы, такие как CDI / Weld). Серверы GlassFish / Payara наиболее близки к WebLogic в отношении используемых фактических реализаций.

4. Большое вам спасибо за объяснение. Я посмотрю, как далеко я смогу продвинуться с Tomee. Я также посмотрю, разрешено ли нам использовать GlassFish и т. Д. Действительно ценю это. В настоящее время он никуда не денется! 🙂

5. Я бы абсолютно использовал TomEE, а не Tomcat для этой цели. Вы все равно можете столкнуться с некоторыми небольшими причудами, но вы продвинулись бы намного дальше.

Ответ №1:

Задача была выполнена путем преобразования приложения из spring в spring-boot, а затем с использованием встроенного tomcat. Это было сделано другим разработчиком, поэтому я не имею четкого представления о том, что было сделано, но, по крайней мере, я могу закрыть эту тему.