2016-12-14 12 views
7

Patrząc na Spring Boot teraz i chcesz zrobić to poprawnie, używając konfiguracji Java i ostatecznie bez żadnego web.xml. Tak więc trudnym zadaniem jest to, że środowisko produkcyjne wymaga klasycznego pliku WAR.Spring Boot nadal wymaga odnowienia zasobu w web.xml

W związku z tym w mojej aplikacji Maven pom.xml określono plik , a główna klasa aplikacji rozszerza się o SpringBootServletInitializer.

Działa dobrze. Trudną częścią jest to, że w środowisku produkcyjnym Datasource jest udostępniane poprzez JNDI. W klasycznym wiosennej aplikacji będzie można odwołać tę zależność w web.xml użyciu resource-ref następująco:

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

Wszystkie badania robiłam wskazuje na to, że będę w stanie pozbyć się web.xml i zastąpienie go odpowiedni plik context.xml (w folderze META-INF):

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

Niestety to nie działa:/

Interesującą rzeczą jest to, że zwykły servlet3 internetowa aplikacja działa tylko dobrze w ten sposób, patrz [https://github.com/steinermatt/servlet3-sample].

Tak więc, mam ochotę uwierzyć, że główna przyczyna, z powodu której nie działa aplikacja Spring Boot, jest powiązana z procesem bootowania Spring Boot ... tak naprawdę szuka wskazówek, sugestii, co może być!!!

Każda pomoc jest doceniana!

Odpowiedz

0

Domyślnie JNDI jest wyłączone we wbudowanym Tomcat.

Można użyć następującego kodu, aby włączyć JNDI w tomcat. Poniższy kod pomoże Ci zainicjować komponent bean źródła danych 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); 
     } 
    }; 
} 

Możesz użyć komponentu bean DataSource w kontrolerze, używając automatycznego okablowania.

@Autowired 
private DataSource dataSource;