2016-12-14 17 views
7

Nhìn vào Spring Boot ngay bây giờ và muốn làm điều đó đúng cách, như sử dụng cấu hình Java và cuối cùng không có bất kỳ web.xml. Vì vậy, phần khó khăn là môi trường sản xuất yêu cầu tệp cổ điển WAR.Khởi động mùa xuân vẫn yêu cầu tài nguyên-ref trong web.xml

Do đó, tôi được chỉ định WAR đóng gói trong tệp Maven pom.xml của mình và lớp Ứng dụng chính mở rộng SpringBootServletInitializer.

Chỉ hoạt động tốt. Bây giờ, phần khó khăn là trong môi trường sản xuất, Datasource được cấp phép qua JNDI. Trong một ứng dụng mùa xuân cổ điển, bạn sẽ tham khảo phụ thuộc này trong web.xml sử dụng một resource-ref như sau:

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

Tất cả các nghiên cứu tôi đã dường như chỉ ra rằng tôi sẽ có thể thoát khỏi những web.xml và thay thế nó bằng một tương ứng context.xml tập tin (trong thư mục META-INF):

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

Thật không may điều đó không làm việc:/

điều thú vị mặc dù là một ứng dụng web đơn giản servlet3 chỉ hoạt động tốt theo cách đó, xem [https://github.com/steinermatt/servlet3-sample]. Vì vậy, tôi bị cám dỗ để tin rằng nguyên nhân gốc rễ nó không làm việc cho một ứng dụng khởi động mùa xuân có liên quan đến quá trình bootstrapping khởi động mùa xuân ... vì vậy, thực sự tìm kiếm bất kỳ gợi ý, gợi ý về những gì nó có thể được !!!

Mọi trợ giúp đều được đánh giá cao!

Trả lời

0

Theo mặc định, JNDI bị tắt trong Tomcat được nhúng.

Bạn có thể sử dụng mã sau để bật JNDI trong tomcat. Mã sau đây sẽ giúp bạn khởi tạo bean mùa xuân của 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); 
     } 
    }; 
} 

Bạn có thể sử dụng bean DataSource trong bộ điều khiển của mình bằng cách sử dụng tự động đấu dây.

@Autowired 
private DataSource dataSource; 
Các vấn đề liên quan