JNDI в Spring Boot с дополнительным встроенным контейнером Tomcat - PullRequest
0 голосов
/ 06 февраля 2019

Я довольно новичок в весенней загрузке и реализовал способ размещения источника данных в контексте JNDI, следуя совету, данному в Как создать контекст JNDI в Spring Boot со встроенным контейнером Tomcat

Я заставил его работать, добавив эти bean-компоненты в приложение, которые позволяют именовать и помещать источник данных в JNDI-контекст следующим образом:

@Autowired
Environment env;

public static void main(final String[] args) {
 SpringApplication.run(MyApplication.class, args);
}


@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory(){

  @Override
  public TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(final Tomcat tomcat) {
    tomcat.enableNaming();
    return super.getTomcatEmbeddedServletContainer(tomcat);
  }

  @Override
  public void postProcessContext(final Context context) {
    final String dataSourceURL = env.getProperty("datasource.url");
    // more properties

    final ContextResource resource = new ContextResource();
    resource.setType(DataSource.class.getName());
    resource.setProperty("url", dataSourceURL);
    // more properties

    resource.setName("jdbc/myDB");
    resource.setAuth("Container");
    resource.setType("javax.sql.DataSource");
    resource.setScope("Sharable");

    resource.setProperty("factory", "org.apache.commons.dbcp.BasicDataSourceFactory");

    context.getNamingResources().addResource(resource);
  }
};
}

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

Пока все хорошо, это сработало.Но теперь спецификация проекта изменилась.В дополнение к доставке толстого JAR, который запускает встроенный Tomcat (как изначально планировалось), мне нужно иметь возможность доставить WAR, который не имеет ссылок на встроенный Tomcat.Поэтому я создал дополнительные проекты для упаковки и обработал необязательное включение встроенного Tomcat через зависимости Maven.Проблема в том, что мне пришлось переместить код, показанный выше, из моего основного класса в отдельный пакет, который я включил через зависимость Maven.И теперь это больше не работает.

Я признаю, что я не слишком знаком с тем, как работает Spring-magic с @Autowired и @Bean, поэтому я немного спотыкаюсь здесь.

Что мне нужно сделать, чтобы создание контекста JNDI работало вне моего основного класса?

1 Ответ

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

Решение оказалось довольно простым, и я мог найти его, узнав больше о бобах.Я создал другой класс, в котором были созданы компоненты, пометил его @Configuration и добавил в спецификацию @ComponentScan основного класса.Выглядит так:

@ComponentScan(basePackages = {"myBasePackage",
                           "externalPackageContainingConfiguration"})

externalPackageContainingConfiguration можно найти только тогда, когда артефакт добавлен через Maven Dependency.Немного хакерский, но делает свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...