Spring mvc 为什么可以';我的web应用程序上下文不能加载我的jar属性文件吗?

Spring mvc 为什么可以';我的web应用程序上下文不能加载我的jar属性文件吗?,spring-mvc,classloader,spring-boot,Spring Mvc,Classloader,Spring Boot,这是我的设置/上下文。我有一个JAR项目,它使用spring boot 1.1.4,它使用Java配置加载属性文件: @Configuration @ComponentScan @EnableAutoConfiguration @PropertySource(name="appProps", value="classpath*:application-${spring.profiles.active}.properties") public class DataJpaApplication {

这是我的设置/上下文。我有一个JAR项目,它使用spring boot 1.1.4,它使用Java配置加载属性文件:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@PropertySource(name="appProps", value="classpath*:application-${spring.profiles.active}.properties")
public class DataJpaApplication {


@Autowired Environment env;


@Bean
//note, this PSPSHC is ours derived from the Spring one with specialized code.
public static org.springframework.context.support.PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceHolderConfigurer encryptionPropertySourcesPlaceHolderConfigurer = new PropertySourcesPlaceHolderConfigurer();
    encryptionPropertySourcesPlaceHolderConfigurer
            .setIgnoreUnresolvablePlaceholders(true);
    return encryptionPropertySourcesPlaceHolderConfigurer;
}
}
这个jar可以与独立的单元测试配合使用。然后,我尝试将其合并到一个web应用程序(不使用spring boot的spring mvc web应用程序)中,使其成为maven依赖项,并将其添加到上下文中,如下所示:

<beans:bean id="jpaConfigBean"
    class="com.somepackage.DataJpaApplication" />
编辑

关于上述错误的澄清。web应用程序正在加载其上下文并导入jar文件的上下文。正是这个jar项目通过@PropertySource加载application-local.properties。那么,这可能是关于父/子上下文交互的吗

注意:没有代码在什么地方加斜杠

以下是我如何在web应用程序中引导spring配置:

<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:**/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

appServlet
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
类路径*:**/servlet-context.xml
1.
我已检查了以下类型的内容:

  • 确认maven生成的清单在war文件中有jar文件的类路径条目
  • 将web.xml改为使用/web-INF/servlet-context.xml(标准路径)
  • 在JBoss而不是tc中部署此web应用
  • 将应用程序-*.property文件移动到另一个文件夹并引用该文件夹
  • 将*.property文件复制到web app项目
  • 确认WTP部署程序集实际上引用了maven
  • 打开生成的war文件并确认jar文件将该文件放在预期位置
  • 还有其他一些事情没有成功

    我看不出有什么问题。请帮助找出错误/配置错误的位置。另外,如果您需要查看更多配置或文件来帮助调试此问题,请告诉我

    提前感谢,

    斯科特

    编辑

    完整的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    
      <context-param>
          <param-name>log4jConfigLocation</param-name>
          <param-value>log4j.xml</param-value>
       </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
     <!-- commented out for debugging...trying to reduce the complexity to get to root cause
     <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:**/*Context.xml,     
            classpath*:**/*-context.xml
         </param-value>
      </context-param> -->
      <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath*:**/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
      <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
      </filter>
      <filter>
        <filter-name>springOpenEntityManagerInViewFilter</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
      </filter>
      <filter-mapping>
       <filter-name>springSecurityFilterChain</filter-name>
       <url-pattern>/*</url-pattern>
      </filter-mapping>
     <filter-mapping>
        <filter-name>springOpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
      <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
      </listener-class>
    </listener>
    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/views/404.jsp</location>
    </error-page> 
    <error-page>
        <error-code>500</error-code>
        <location>/WEB-INF/views/500.jsp</location>
    </error-page>
    <error-page>
     <location>/WEB-INF/views/500.jsp</location>
    </error-page>  
    </web-app>
    
    
    log4jConfigLocation
    log4j.xml
    org.springframework.web.context.ContextLoaderListener
    appServlet
    org.springframework.web.servlet.DispatcherServlet
    上下文配置位置
    类路径*:**/servlet-context.xml
    1.
    appServlet
    /
    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy
    SpringOpenEntityManager视图过滤器
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    springSecurityFilterChain
    /*
    SpringOpenEntityManager视图过滤器
    /*
    org.springframework.security.web.session.HttpSessionEventPublisher
    404
    /WEB-INF/views/404.jsp
    500
    /WEB-INF/views/500.jsp
    /WEB-INF/views/500.jsp
    
    完整(模糊)servlet-context.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:cache="http://www.springframework.org/schema/cache" xmlns:task="http://www.springframework.org/schema/task"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
            http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
    
        <beans:bean id="jpaConfigBean"
            class="com.somepackage.DataJpaApplication" />
    
    
        <!-- DispatcherServlet Context: defines this servlet's request-processing 
            infrastructure -->
    
        <context:annotation-config />
        <context:component-scan base-package="com.somepackage.*" />
    
        <!-- Needed for transaction methods in controllers -->
        <tx:annotation-driven />
    
        <beans:bean id="ehCacheManager"
            class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
            p:shared="true" />
    
        <beans:bean id="cacheManager"
            class="org.springframework.cache.ehcache.EhCacheCacheManager"
            p:cacheManager-ref="ehCacheManager" />
    
        <cache:annotation-driven cache-manager="cacheManager" />
    
        <task:scheduled-tasks>
            <task:scheduled ref="runScheduler" method="run" cron="0 0 3 * * *" />
            <task:scheduled ref="runScheduler" method="run"
                initial-delay="0" fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" />
        </task:scheduled-tasks>
    
    
        <!-- Enables the Spring MVC @Controller programming model -->
        <annotation-driven conversion-service="conversionService" />
    
    
        <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
            up static resources in the ${webappRoot}/resources directory -->
        <resources mapping="/resources/**" location="/resources/" />
    
        <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
            in the /WEB-INF/views directory -->
        <beans:bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <beans:property name="prefix" value="/WEB-INF/views/" />
            <beans:property name="suffix" value=".jsp" />
        </beans:bean>
    
        <beans:bean id="validator"
            class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
    
        <beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
    
        <beans:bean id="contentNegotiationManager"
            class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
            <beans:property name="favorPathExtension" value="true" />
            <beans:property name="favorParameter" value="false" />
            <beans:property name="ignoreAcceptHeader" value="false" />
            <beans:property name="mediaTypes">
                <beans:value>
                    html=text/html
                    json=application/json
                    xml=application/xml
                </beans:value>
            </beans:property>
        </beans:bean>
    
    </beans:beans>
    
    
    html=text/html
    json=应用程序/json
    xml=应用程序/xml
    

    除了我在上面强调的内容外,我不确定这些文件中是否有任何相关内容,但为清晰起见,根据请求添加了这些内容。

    我没有足够的声誉来链接相关条目,但我确实回顾了以下其他类似问题:乍一看,它看起来是正确的,但有很多我们没有看到。您可以发布完整的web.xml和servlet context.xml吗?对于初学者,您可以获得两个配置实例。一个是您手动声明的,另一个是使用
    组件扫描
    检测到的(对于该扫描,您应该从基本包名称中删除
    *
    ,它不是一个模式,您也可以删除
    ,因为已经暗示了这一点)。另外,我也不确定你在哪里使用Spring boot,因为你正在做大量的工作来解决Spring boot给你带来的神奇和轻松。@m.Deinum,谢谢你的回复。我们在应用程序中进行了更改,但它“变得更糟”,因为它找不到以前用来查找的bean。这个*是一个doh!而且很明显。至于spring引导的使用,它是复杂的。这里没有提到使用SpringBoot的项目,也没有使用任何XML配置。它是与开发人员不知道或使用SpringBoot的web应用程序项目分开编写的。因此,简言之,出于必要而非选择,我们将两者结合在一起进行战争部署。还有什么建议吗?
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:cache="http://www.springframework.org/schema/cache" xmlns:task="http://www.springframework.org/schema/task"
        xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
            http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
    
        <beans:bean id="jpaConfigBean"
            class="com.somepackage.DataJpaApplication" />
    
    
        <!-- DispatcherServlet Context: defines this servlet's request-processing 
            infrastructure -->
    
        <context:annotation-config />
        <context:component-scan base-package="com.somepackage.*" />
    
        <!-- Needed for transaction methods in controllers -->
        <tx:annotation-driven />
    
        <beans:bean id="ehCacheManager"
            class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
            p:shared="true" />
    
        <beans:bean id="cacheManager"
            class="org.springframework.cache.ehcache.EhCacheCacheManager"
            p:cacheManager-ref="ehCacheManager" />
    
        <cache:annotation-driven cache-manager="cacheManager" />
    
        <task:scheduled-tasks>
            <task:scheduled ref="runScheduler" method="run" cron="0 0 3 * * *" />
            <task:scheduled ref="runScheduler" method="run"
                initial-delay="0" fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" />
        </task:scheduled-tasks>
    
    
        <!-- Enables the Spring MVC @Controller programming model -->
        <annotation-driven conversion-service="conversionService" />
    
    
        <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
            up static resources in the ${webappRoot}/resources directory -->
        <resources mapping="/resources/**" location="/resources/" />
    
        <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
            in the /WEB-INF/views directory -->
        <beans:bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <beans:property name="prefix" value="/WEB-INF/views/" />
            <beans:property name="suffix" value=".jsp" />
        </beans:bean>
    
        <beans:bean id="validator"
            class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
    
        <beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
    
        <beans:bean id="contentNegotiationManager"
            class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
            <beans:property name="favorPathExtension" value="true" />
            <beans:property name="favorParameter" value="false" />
            <beans:property name="ignoreAcceptHeader" value="false" />
            <beans:property name="mediaTypes">
                <beans:value>
                    html=text/html
                    json=application/json
                    xml=application/xml
                </beans:value>
            </beans:property>
        </beans:bean>
    
    </beans:beans>