2010-11-22 34 views
6

Mở web.xml của tôi, tôi có một "SpringMVC" khai servlet (trong đó có một SpringMVC-servlet.xml tương ứng)ứng dụng Spring Context tải tự

<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> 

Tôi cũng có tập tin applicationContext.xml thông thường của tôi.

Cái nào được tải trước? Tệp springmvc-servlet.xml hoặc applicationContext.xml?

Lý do tôi hỏi điều này là bất cứ khi nào tôi đặt phần tử <mvc:annotation-driven/> trong applicationContext.xml, tôi nhận được một lỗi Ngữ cảnh nghiêm trọng. Nhưng khi tôi đặt phần tử đó vào tệp springmvc-servlet.xml, ứng dụng web của tôi chạy tốt.

Mọi ý tưởng tại sao?

Trên một ứng dụng web khác, tôi có <mvc:annotation-driven/> bên trong applicationContext.xml và nó chạy tốt.

Phụ Lục: tôi nhận thấy rằng sự hiện diện của aop: config đặt ra xung đột chống lại MVC: chú thích-driven

+0

Vui lòng, sao chép theo dõi ngăn xếp ngoại lệ vào câu hỏi của bạn. Bạn đã xác định xsd cho không gian tên mvc trong applicationContext.xml chưa? – MarrLiss

+0

Không có dấu vết ngăn xếp. Tôi chỉ nhận được lỗi ngữ cảnh nghiêm trọng điển hình từ Tomcat. – chris

Trả lời

0

Trừ web.xml không có trật tự được xác định trước. Điều này xảy ra:

  • web.xml được nạp bởi servlet engine, điều này gây nên trạng tải của mọi servlets, các bộ lọc, người nghe xác định,
  • các ContextLoaderListener tải gốc bối cảnh ứng dụng XML, này có thể bao gồm một định nghĩa bean cho một LocalSessionFactoryBean , gây ra tải của tất cả các bản đồ XML Hibernate file
  • các DispatcherServlet tải web ứng dụng bối cảnh XML

Nghiên cứu web.xml để xác định thứ tự trong từng trường hợp.

also see:

link

+0

Trong web.xml của tôi, tôi chỉ có tệp xxxxx-servlet.xml. Tôi đã không khai báo bất kỳ tệp Spring XML nào khác. Tệp applicationContext.xml được tải theo mặc định mà không có bất kỳ cấu hình đặc biệt nào. Tôi thực sự không biết tại sao nó hoạt động trên một số ứng dụng dựa trên vị trí của họ – chris

+0

Tôi đang tiêu hóa thông tin này và hiện đang thử nghiệm ... Tôi nghĩ rằng tôi đang ở trong một số nội dung – chris

+0

Ok tuyệt vời, tôi rất vui vì thông tin này đang giúp bạn . – Michel

5

bối cảnh applicationContext.xml là cha mẹ đến dispatcher-servlet.xml ngữ cảnh. Tôi không biết điều này có nghĩa là nó được tải trước hay không, nhưng không quan trọng trong trường hợp của bạn:

<mvc:annotation-driven /> phải ở trong dispatcher-servlet.xml, vì nó thuộc về phần web của ứng dụng.

+0

Dựa trên quan sát, tôi không nghĩ vậy. Tôi có một ứng dụng web, nơi nằm trong applicationContext.xml. Trong thực tế, nếu tôi đặt trong xxxxx-servlet, tôi chỉ nhận được lỗi SEVERE CONTEXT. Tôi cần yếu tố đó bởi vì Bộ điều khiển và Nhân viên phục vụ của tôi được đánh dấu bằng cách sử dụng chú thích @Controller và @Service tương ứng – chris

+0

@chris cách chia sẻ thông điệp chính xác và dấu vết của ngoại lệ phân phát? – Bozho

0

Bạn có thể có thêm không gian tên MVC với bối cảnh ứng dụng:

<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" 
> 

(không gian tên khác tước)

+0

Tôi đã nhận được. Eclipse sẽ tự động phàn nàn khi tôi bỏ qua các lược đồ đó – chris

+0

Nghĩ như vậy, nhưng tôi chỉ kiểm tra, cho đầy đủ. –

3

tôi giải quyết vấn đề của tôi!

Hóa ra không có gì liên quan đến thứ tự tải hoặc khi tuyên bố <mvc:annotation-driven/>.

Tôi đã thử triển khai ứng dụng web của mình trên một Tomcat khác và trước sự ngạc nhiên của tôi có một dấu vết ngăn xếp trong nhật ký cục bộ. Tôi đã có một gợi ý bằng thử và sai rằng xung đột là với <aop:config/>. Nhưng xung đột cụ thể là gì?

Sau đó, tôi thấy lỗi này trong file log:

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

Vì vậy, chúng tôi có một ngoại lệ cast. Tôi googled lỗi chính xác ở trên và thấy điều này: Spring 3: adding causes ClassCastException

Nó xuất hiện khởi động chuỗi và tôi có cùng một vấn đề chính xác. Vì vậy, tôi đã tải về các aspectj-1.6.10.jar nhưng tôi vẫn còn thiếu một lớp. Sau đó, hóa ra nó phải là aspectjweaver-1.6.9

Tôi vẫn đang sử dụng một phần tử rất cũ. Nó không có bất kỳ phiên bản nào trên tên của nó. Đã giải quyết được sự cố. Trường hợp đóng cửa.

Bằng cách như một phần thưởng, tôi đã tự trải ra các yếu tố <mvc:annotation-driven/> để khai xml tương đương:

<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" /> 

Họ giống hệt nhau khi bạn khai báo <mvc:annotation-driven/> dựa trên những gì tôi đã nghiên cứu .

Nhờ mọi người đã giúp tôi.

Các vấn đề liên quan