Я довольно новичок в весенней загрузке и реализовал способ размещения источника данных в контексте 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 работало вне моего основного класса?