Spring Boot 2 Embedded Tomcat Jndi Конфигурация источника данных - PullRequest
0 голосов
/ 28 сентября 2018

Доброе утро в моем часовом поясе

У меня уже есть два вопроса о переполнении стека:

Spring Boot с использованием встроенного Tomcat с JNDI

и

Как использовать соединение с базой данных JNDI с Spring Boot и Spring Data с использованием встроенного Tomcat?

И ни одна из них не сработала.Я использую Spring Boot 2. Я хочу настроить встроенный Tomcat Server для работы с JNDI.У меня есть попытка подходов:

Фрагмент кода:

 @SpringBootApplication 
   public class MyApplication {

    public static void main ...


    @Bean   
   public ServletWebServerFactory servletContainer() {      TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {


     @Override          
     protected void postProcessContext(Context context) {
                    ContextResource resource = new ContextResource();
                    resource.setName("jdbc/CCC");
                    resource.setType(DataSource.class.getName());
                    resource.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
                    resource.setProperty("url", "jdbc:oracle:thin:@a77k11111188.tt.ddd.test:3000:BHJR00TT00");
                    resource.setProperty("username", "user");
                    resource.setProperty("password", "pass");
                    context.getNamingResources().addResource(resource);             }

     @Override          
    protected TomcatWebServer getTomcatWebServer(Tomcat tomcat){
                    tomcat.enableNaming();
                    TomcatWebServer container =  super.getTomcatWebServer(tomcat);
                    for(Container child  :container.getTomcat().getHost().findChildren()){
                        if (child instanceof Context) {
                            ClassLoader contextClassLoader = ((Context)child).getLoader().getClassLoader();
                            Thread.currentThread().setContextClassLoader(contextClassLoader);
                            break;
                        }
                    }
                    return container;           }

            };      return tomcat;

An затем использовать application.properties

spring.datasource.jndi-name=java:comp/env/jdbc/CCC

Журнал ошибок: не удается запустить встроенный Tomcat
Ошибка создания компонента с именем 'servletEndpointRegistrar'
Ошибка создания компонента с именем 'dataSource' DataSourceLookupFailureException: Не удалось найти источник данных JNDI с именем 'java: comp / env / jdbc / CCC'
.NamingException: не удалосьсоздать экземпляр фабрики ресурсов

ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory

Вместо этого, если я не использую свойства приложения и настраиваю боб источника данных непосредственно в Spring Boot Application, какthis

@Bean(destroyMethod = "")
    public DataSource jndiDataSource() throws IllegalArgumentException, NamingException {
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiName("java:comp/env/jdbc/CCC");
        bean.setProxyInterface(DataSource.class);
        bean.setLookupOnStartup(false);
        bean.afterPropertiesSet();
        return (DataSource) bean.getObject();
    } 

Журнал ошибок
UnsatisfiedDependencyException: Ошибка создания бина с именем entityManagerFactory
BeanCreationException: Ошибка создания бина с именем 'jpaVendorAdapter'

JndiLookupFargeiTourceBjectполучить новый целевой объект
NamingException: Не удалось создать экземпляр фабрики ресурсов

В моем pom у меня есть следующие зависимости

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
     <groupId>com.oracle</groupId>
     <artifactId>ojdbc7</artifactId>
     <version>12.1.0.2</version>
   </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
  </dependency>  

У меня нет решений Заранее спасибо С уважением

1 Ответ

0 голосов
/ 05 февраля 2019

Я также столкнулся с той же проблемой, и большая часть примера в Интернете использовала TomcatEmbeddedServletContainerFactory, однако, попробовав несколько вещей, я наконец смог установить соединение jndi в своем приложении.

Я все еще выясняюточная основная причина проблемы, но ниже приведен код для вашей справки.

@SpringBootApplication
public class MybatisJNDISampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisJNDISampleApplication.class, args);
    }

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

            @Override
            protected void postProcessContext(Context context) {
                ContextResource resource = new ContextResource();           
                //resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory");
                resource.setName("jdbc/myDatasourceName");
                resource.setType(DataSource.class.getName());
                resource.setProperty("driverClassName", "oracle.jdbc.OracleDriver");
                resource.setProperty("url", "db_url");
                resource.setProperty("username", "db_username");
                resource.setProperty("password", "db_password");
                context.getNamingResources().addResource(resource);
            }
        };
    }
}

Ниже приведен мой класс конфигурации:

@Configuration
@MapperScan("com.sample.mybatis")
public class DataConfig {

    public final String MAPPER_LOCATIONS_PATH = "classpath:mybatis-mappers/*.xml";

    @Bean(destroyMethod="")
    public DataSource dataSource() throws IllegalArgumentException, NamingException {
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiName("java:comp/env/jdbc/myDatasourceName");
        //bean.setResourceRef(true); // this was previously uncommented
        bean.setProxyInterface(DataSource.class);
        //bean.setLookupOnStartup(false); // this was previously uncommented
        bean.afterPropertiesSet();
        return (DataSource)bean.getObject();
    }

    @Bean
    public DataSourceTransactionManager transactionManager() throws NamingException {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        configureSqlSessionFactory(sessionFactory, dataSource());
        return sessionFactory.getObject();
    }

    public void configureSqlSessionFactory(SqlSessionFactoryBean sessionFactoryBean, DataSource dataSource) throws IOException {
        PathMatchingResourcePatternResolver pathResolver = new PathMatchingResourcePatternResolver();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(pathResolver.getResources(MAPPER_LOCATIONS_PATH));
    }
}

Надеюсь, это поможет вам решить вашу проблему.

...