spring boot - 如何加载上下文配置文件

时间:2018-03-30 16:49:01

标签: spring-mvc spring-boot tomcat8

我正在尝试将spring mvc app转换为spring boot。我曾经在tomcat中部署这个应用程序并进行测试。现在使用spring boot我正在尝试做同样的事情,但我面临加载xml文件配置的问题。

   submit(){
//calling functions
this.function1();
this.function2();
}
//declaring functions
function1(){}
function2(){}

这是我正在尝试加载的配置文件。当我把

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <!-- Data sources -->
    <Environment name="/source/schema" value="${schema}" type="java.lang.String" />

    <Resource auth="Container" driverClass="org.postgresql.Driver" 
            factory="org.apache.naming.factory.BeanFactory" 
            idleConnectionTestPeriod="30" jdbcUrl="${url}" 
            maxAdministrativeTaskTime="0" maxConnectionAge="30" maxIdleTime="9" maxPoolSize="3" minPoolSize="2" 
            name="/source/DataSource" password="${password}" 
            preferredTestQuery="select 1" testConnectionOnCheckout="true" type="com.mchange.v2.c3p0.ComboPooledDataSource" user="${user}"/>
</Context>

我可以从applicationcontext.xml加载所有bean配置,但是在加载context.xml时它正在提供

@ImportResource({"classpath:applicationContext.xml", "classpath:context.xml"})

在tomcat中部署spring boot app时,如何加载这些条目?

2 个答案:

答案 0 :(得分:0)

默认情况下,嵌入式Tomcat中禁用JNDI。您需要调用Tomcat.enableNaming()来启用它。

如果您可以使用Java配置,您可以尝试使用java配置从下面的代码片段中添加JNDI和其他配置。

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

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

示例:

@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);
        }
    };
}

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

请查看此github link相关示例

答案 1 :(得分:0)

context.xml应该进入war文件中的/META-INF/目录。这是对Tomcat服务器的说明,无需在Spring中进行任何配置即可尝试加载它。