Порядок загрузки контекста приложения Spring - PullRequest
6 голосов
/ 22 ноября 2010

В моем web.xml у меня есть объявление сервлета "springmvc" (которое имеет соответствующий 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?

Причина, по которой я спрашиваю это, заключается в том, что всякий раз, когда я помещаю элемент <mvc:annotation-driven/> в applicationContext.xml, я получаю ошибку серьезного контекста.Но когда я помещаю этот элемент в springmvc-servlet.xml, мое веб-приложение работает нормально.

Есть идеи, почему?

В другом веб-приложении у меня есть <mvc:annotation-driven/> внутри applicationContext.xml, и он работает нормально.

Добавление: я заметил, чтоналичие aop: config создает конфликт с mvc: на основе аннотаций

Ответы [ 4 ]

5 голосов
/ 22 ноября 2010

контекст applicationContext.xml является родительским для контекста dispatcher-servlet.xml. Я не знаю, означает ли это, что он загружается первым, но в вашем случае это не имеет значения:

<mvc:annotation-driven /> должно быть в dispatcher-servlet.xml, поскольку оно принадлежит веб-части приложения.

3 голосов
/ 23 ноября 2010

Я решил свою проблему!

Оказывается, это не имеет ничего общего с порядком загрузки или с объявленным <mvc:annotation-driven/>.

Я попытался развернуть свое веб-приложение на другом Tomcat, и, к моему удивлению, в журнале локального хоста есть трассировка стека. Методом проб и ошибок у меня был намек на то, что конфликт с <aop:config/>. Но какой конкретно конфликт?

Тогда я увидел эту ошибку в файле журнала:

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

Итак, у нас есть исключение. Я погуглил ту точную ошибку выше и нашел это: Spring 3: добавление вызывает ClassCastException

Похоже, у меня есть нить, и у меня точно такая же проблема. Поэтому я скачал aspectj-1.6.10.jar, но мне все еще не хватало класса. Тогда оказывается, что это должен быть aspectjweaver-1.6.9

Я все еще использовал очень старый аспект-ткач. У этого не было никакой версии на его имени. Задача решена. Дело закрыто.

Кстати, в качестве бонуса я вручную развернул элемент <mvc:annotation-driven/> до его эквивалентного объявления 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" />

Они точно такие же, когда вы объявляете <mvc:annotation-driven/> на основании того, что я исследовал.

Спасибо всем, кто помог мне.

0 голосов
/ 22 ноября 2010

Возможно, вам придется добавить пространство имен 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"
>

(другие пространства имен удалены)

0 голосов
/ 22 ноября 2010

За исключением web.xml, здесь нет предопределенного заказа.Это происходит:

  • web.xml загружается механизмом сервлетов, это запускает загрузку всех определенных сервлетов, фильтров, прослушивателей,
  • ContextLoaderListener загружает корневой контекст XML приложения,это может включать определение bean-компонента для LocalSessionFactoryBean, запускающего загрузку всех XML-файлов отображения Hibernate
  • , DispatcherServlet загружает контекст веб-приложения XML

Изучите файл web.xml, чтобы определитьпорядок в каждом случае.

см. также:

ссылка

...