2016-12-14 5 views
7

Посмотрите прямо сейчас на Spring Boot и хотите сделать это правильно, используя конфигурацию Java и, в конечном счете, без web.xml. Итак, сложная часть состоит в том, что для производственной среды требуется классический файл WAR.Spring Boot по-прежнему требует ссылки на ресурс в web.xml

Следовательно, я указан WAR упаковка в моем Maven pom.xml файл и основной класс приложения распространяется SpringBootServletInitializer.

Работы прекрасно. Теперь сложная часть заключается в том, что в производственной среде Datasource предоставляется через JNDI. В классическом Spring приложение, которое вы бы ссылаться на эту зависимость в web.xml с помощью resource-ref следующим образом:

<resource-ref> 
    <res-ref-name>jdbc/DefaultDB</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
</resource-ref> 

Все исследования я сделал, кажется, указывает, что я хотел бы быть в состоянии избавиться от web.xml и заменить его с соответствующий context.xml файл (в папке META-INF):

<Resource name="jdbc/DefaultDB" 
      auth="Container" 
      type="javax.sql.DataSource" 
      factory="com.sap.jpaas.service.persistence.core.JNDIDataSourceFactory"/> 

К сожалению, это не работает:/

интересная вещь, хотя в том, что веб-приложение равнину servlet3 работает только хорошо так, смотреть [https://github.com/steinermatt/servlet3-sample].

Итак, у меня возникает соблазн поверить, что причина, из-за которой она не работает для приложения Spring Boot, связана с процессом начальной загрузки Spring Boot ... поэтому, действительно ищет любые подсказки, предложения о том, что это может сделать быть!!!

Любая помощь приветствуется!

ответ

0

По умолчанию JNDI отключен во встроенном Tomcat.

Вы можете использовать следующий код, чтобы включить JNDI в tomcat. Следующий код поможет вам инициализировать источник данных DataSource.

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

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

     @Override 
     protected void postProcessContext(Context context) { 
      ContextResource resource = new ContextResource(); 
      resource.setName("jdbc/myDataSource"); 
      resource.setType(DataSource.class.getName()); 
      resource.setProperty("driverClassName", "your.db.Driver"); 
      resource.setProperty("url", "jdbc:yourDb"); 

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

Вы можете использовать компонент DataSource в своем контроллере, используя автоматическую проводку.

@Autowired 
private DataSource dataSource; 

 Смежные вопросы

  • Нет связанных вопросов^_^