Как интегрировать REST-сервис JAX-RS с поиском JNDI в SpringBoot? - PullRequest
1 голос
/ 11 ноября 2019

У меня есть простая REST-служба jax-rs, которая развернута как WAR на сервере wildfly и использует поиск JNDI для источника данных, настроенного в standalone.xml. Для этого путь читается из файла datasource.properties. Затем служба выполняет действия базы данных через этот источник данных.

Теперь я хочу использовать этот REST-сервис в приложении SpringBoot, которое развернуто на встроенном коте. Моя реализация использует RESTEasy, и сервис может быть легко интегрирован с resteasy-spring-boot-starter. Но поиск JNDI не работает, потому что, конечно, источник данных теперь настроен не в standalone.xml, а в файле application.properties. Это совершенно другой источник данных.

Я ищу решение для установки источника данных без необходимости его "жесткого кодирования". Вот как соединение извлекается в настоящее время в WAR для wildfly:

private Connection getConnection() {

    Connection connection = null;

    try (InputStream config = OutboxRestServiceJbossImpl.class.getClassLoader().getResourceAsStream("application.properties")) {

        Properties properties = new Properties();
        properties.load(config);
        DataSource ds = (DataSource) new InitialContext().lookup(properties.getProperty("datasource"));
        connection = ds.getConnection();

    } catch (Exception e) {

    }

    return connection;
}

В настоящее время я решил эту проблему, имея основной модуль, который фактически выполняет логику, и 2 реализации с jax-rs для wildfly и SpringMVC вSpringBoot. Они вызывают методы экземпляра основного модуля, и соединение передается этим методам. Для wildfly это выглядит так:

public String getHelloWorld() {


    RestServiceCoreImpl rsc = new RestServiceCoreImpl();

    try (Connection connection = getConnection()) {

        String helloWorld  = rsc.getHelloWorld(connection);

    } catch (Exception e) {

    }
    return helloWorld;
}


public String getHelloWorld(Connection connection){

//database stuff, eg. connection.execute(SQL);
}

И так в SpringBoot:

@Autowired
RestServiceCoreImpl rsc;

@Autowired
DataSource restServiceDataSource;

@Override
public String getHelloWorld() {

    try (Connection connection = restServiceDataSource.getConnection()){
        return rsc.getHelloWorld(connection);

    } catch (SQLException e) {

    }

    return null;
}

Есть ли способ решить эту проблему с источником данных? Мне нужно, чтобы решение SpringMVC было заменено решением jax-rs в SpringBoot.

1 Ответ

1 голос
/ 11 ноября 2019

Хорошо, я смог решить это сам. Вот мое решение:

Я включил именование во встроенном сервере Tomcat следующим образом:

@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
    @Override
    protected TomcatWebServer getTomcatWebServer(org.apache.catalina.startup.Tomcat tomcat) {
        tomcat.enableNaming(); 
        return super.getTomcatWebServer(tomcat);
    }

Затем я смог добавить ресурс JNDI в контексте сервера. Теперь возможен поиск JNDI.

...