【问题标题】:Spring Application Context Load OrderSpring 应用程序上下文加载顺序
【发布时间】:2011-05-13 17:22:09
【问题描述】:

在我的 web.xml 上,我有一个“springmvc”servlet 声明(它有一个对应的 springmvc-servlet.xml)

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

我也有我常用的 applicationContext.xml 文件。

先加载哪个? springmvc-servlet.xml 还是 applicationContext.xml?

我问这个的原因是每当我将 &lt;mvc:annotation-driven/&gt; 元素放在 applicationContext.xml 中时,我都会收到一个严重的上下文错误。但是当我将该元素放入 springmvc-servlet.xml 时,我的 Web 应用程序运行良好。

有什么想法吗?

在另一个网络应用上,我在 applicationContext.xml 中有 &lt;mvc:annotation-driven/&gt;,它运行良好。

附录: 我确实注意到 aop:config 的存在与 mvc:annotation-driven

存在冲突

【问题讨论】:

  • 请复制异常堆栈跟踪到您的问题。是否在 applicationContext.xml 中为 mvc 命名空间定义了 xsd?
  • 没有堆栈跟踪。我只从 Tomcat 中得到典型的 Severe Context 错误。

标签: java spring spring-mvc web.xml


【解决方案1】:

我的问题解决了!

事实证明它与加载顺序或&lt;mvc:annotation-driven/&gt; 的声明位置无关。

我尝试在另一个 Tomcat 上部署我的网络应用程序,令我惊讶的是,本地主机日志中有一个堆栈跟踪。通过反复试验,我得到了与&lt;aop:config/&gt; 冲突的提示。但具体的冲突是什么?

然后我在日志文件中看到了这个错误:

java.lang.ClassCastException: org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType

所以我们有一个强制转换异常。我在上面搜索了那个确切的错误,发现了这个:Spring 3: adding causes ClassCastException

看来线程启动器和我有同样的问题。所以我下载了aspectj-1.6.10.jar,但我仍然缺课。然后事实证明它应该是 aspectjweaver-1.6.9

我仍在使用一个非常旧的 aspectjweaver。它的名字没有任何版本。问题解决了。结案。

顺便说一句,我已经手动将 &lt;mvc:annotation-driven/&gt; 元素展开到其等效的 xml 声明中:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="validator" />
        </bean>
    </property>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
        </list>
    </property>
</bean>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

当您根据我的研究声明 &lt;mvc:annotation-driven/&gt; 时,它们完全相同。

感谢所有帮助过我的人。

【讨论】:

    【解决方案2】:

    您可能必须将 mvc 命名空间添加到应用程序上下文中:

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
    >
    

    (其他命名空间被剥离)

    【讨论】:

    • 我已经拿到了。当我缺少这些模式时,Eclipse 会自动抱怨
    • 我是这么认为的,但我只是在检查完整性。
    【解决方案3】:

    applicationContext.xml 上下文是 dispatcher-servlet.xml 上下文的父级。我不知道这是否意味着它首先被加载,但在你的情况下并不重要:

    &lt;mvc:annotation-driven /&gt; 必须在dispatcher-servlet.xml 中,因为它属于应用程序的 Web 部分。

    【讨论】:

    • 根据观察,我不这么认为。我有一个网络应用程序,其中 在 applicationContext.xml 中。事实上,如果我放入 xxxxx-servlet,我只会收到 SEVERE CONTEXT 错误。我需要那个元素,因为我的 Controller 和 Servicers 分别使用注释 @Controller 和 @Service 进行标记
    • @chris 如何分享服务异常的确切消息和跟踪?
    【解决方案4】:

    除了 web.xml 没有预定义的顺序。 发生这种情况:

    • web.xml 由 servlet 引擎加载,这会触发所有已定义的 servlet、过滤器、侦听器的加载,
    • ContextLoaderListener 加载 根应用程序上下文 XML,这 可能包括一个 bean 定义 LocalSessionFactoryBean,触发 所有 Hibernate 映射 XML 的负载 文件
    • DispatcherServlet 加载 Web 应用程序上下文 XML

    研究 web.xml 以确定每种情况下的顺序。

    另见:

    link

    【讨论】:

    • 在我的 web.xml 中,我只有 xxxxx-servlet.xml。我没有声明任何其他 Spring XML 文件。 applicationContext.xml 默认加载,没有任何特殊配置。我真的不知道为什么它可以根据位置在某些应用上运行
    • 我正在消化这些信息,目前正在测试......我想我正在做某事
    • 好的,很高兴这些信息对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2019-06-16
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多