Quarkus Как указать источники данных JNDI

Я оцениваю Quakus как замену среде Tomcat. Я понимаю проблемы того, что я пытаюсь сделать, но сначала мне нужно убедиться, что мое существующее унаследованное JSP-приложение будет работать с Quarkus. Я использую quarkus.undertow в качестве контейнера сервлетов.

Я преодолел несколько препятствий. Сейчас я сталкиваюсь с тем, как использовать свои источники данных.

В настоящее время наши источники данных установлены в Tomcat server.xml как GlobalNamingResources и связывают их в META-INF / context.xml веб-приложения как ResourceLinks.

Я перенес настройку источника данных в приложение Quarkus application.properties как таковое:

quarkus.datasource.menudb.url=jdbc:mysql://some.server.url/menuadmin
quarkus.datasource.menudb.driver=com.mysql.cj.jdbc.Driver
quarkus.datasource.menudb.username=web
quarkus.datasource.menudb.password=<password>

что я понимаю из документации, это способ сделать это. Но в документации показано внедрение источника данных:

@Inject
@DataSource("users")
AgroalDataSource dataSource1;

В моем случае я бы заменил users на имя моего источника данных menudb в аннотации. Однако у меня есть классы доступа к данным, которые мне нужно повторно использовать, которые создают InitialContext, ищут источник данных, используя переданное имя ресурса JNDI, и создают источник данных:

InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/<jndi name>");
conn = ds.getConnection();

Это вызывает следующую ошибку:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at com.gy.obj.ContextManager.contextInitialized(ContextManager.java:367)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:188)
...

Первоначальное исследование привело меня к Apache Camel, но это, на первый взгляд, не кажется подходящим решением. Я также читал о настройке jndi.properties следующим образом:

# Needed env settings for JNDI.
java.naming.factory.initial=<Some JNDI Service Provider Name>

Но я не уверен, какой поставщик использовать, и на данный момент не могу найти документацию по различным поставщикам.

Мой вопрос в том, на правильном ли я пути и каким провайдером я бы воспользовался? Мне бы очень не хотелось прикасаться к моим существующим классам доступа к данным, чтобы обеспечить инъекцию, если у меня их тоже нет. Однако я бы не возражал против того, что то, что мы сейчас настроили, работает для Tomcat.


person Paul Stoner    schedule 15.10.2019    source источник


Ответы (1)


JNDI намеренно не поддерживается, так как мы считаем это ненужной сложностью, которая бесполезна в модели Quarkus: нет развертываний во время выполнения, и весь код известен во время сборки, поэтому нет необходимости в таком разделении.

Решение простое: просто адаптируйте код, чтобы искать его не в контексте JDNI, а в диспетчере компонентов CDI.

Хотя мы можем поддерживать большинство высокоуровневых API, переносить существующие приложения должно быть легко, но не предполагайте, что будут предоставлены все устаревшие технологии - сейчас хорошее время, чтобы избавиться от некоторых и двигаться дальше.

Тем не менее, я полагал, что JNDI можно легко эмулировать, но пока мы предпочли бы этого избежать; не стесняйтесь открывать вопрос, если это очень важно для вас.

person Sanne    schedule 16.10.2019