2009-09-23 33 views
7

Khi tôi sử dụng DispatcherServlet, tôi nhận được một java.lang.IllegalStateException : Không tìm thấy WebApplicationContext: không ContextLoaderListener đăng ký? Lỗi khi tôi sử dụng bộ lọc DelegatingFilterProxy. Do đó, tôi đã xóa DispatcherServlet và bây giờ tôi sử dụng ContextLoaderListener thay vào đó và ứng dụng Spring của tôi tải tốt. Tuy nhiên, tôi gặp sự cố với một hạt rất quan trọng:DefaultAnnotationHandlerMapping qua ContextLoaderListener thay vì DispatcherServlet vào mùa xuân 3

<context:component-scan base-package="com.mydomain"/> 
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <property name="interceptors"> 
     <list> 
      <ref bean="openSessionInViewInterceptor" /> 
     </list> 
     </property> 
    </bean> 

Đậu này không còn hoạt động nữa, không có biểu đồ URL nào của tôi được ánh xạ nữa. Nếu tôi chuyển về sử dụng DispatcherServlet, không sao cả (ngoại trừ việc bộ lọc của tôi lại vô ích). Làm thế nào tôi có thể lấy đậu này để tải chính xác từ bên trong ContextLoaderListener?

Cheers

Nik

Trả lời

22

Bạn cần cả ContextLoaderListener các DispatcherServlet - thông báo lỗi không cho bạn biết để loại bỏ các servlet.

Để làm rõ những gì mùa xuân đang làm ở đây, DispatcherServlet tạo riêng của mình ApplicationContext (thường sử dụng xxx-servlet.xml), nhưng bất kỳ bộ lọc mùa xuân mà bạn cấu hình trong web.xml không có quyền truy cập vào các servlet của ApplicationContext.

ContextLoaderListener tạo thứ hai ApplicationContext (được liên kết với toàn bộ webapp) và liên kết chính nó với số ApplicationContext của servlet, cho phép các bộ lọc và servlet giao tiếp qua Spring.

+0

Aha! Đó là RẤT làm rõ. :-) Nhưng, bạn có bất kỳ liên kết tốt về cách tôi có thể cấu hình ContextLoaderListener để nhúng vào bối cảnh của Servlet hoặc cách khác xung quanh? Bởi vì khi tôi sử dụng cả hai, nó instantiates mỗi bean hai lần (ngoại trừ DefaultAnnotationHandler, và miễn là tôi đã đặt context-param's contextConfigLocation thành tệp cấu hình servlet. Nếu tôi tạo một tệp cấu hình riêng biệt, tôi cần sao chép/dán các bean để xác thực, hoặc nhập dữ liệu và lớp kinh doanh, do đó làm cho tất cả các hạt này hai lần Làm thế nào tôi có thể giữ chúng chỉ một lần? – niklassaers

+2

Các appcontext được tạo ra bởi ContextLoaderListener là bối cảnh cha mẹ của appletext của servlet. ContextLoaderListener của appcontext được tự động hiển thị cho các bean trong appletext của servlet (nhưng không phải là cách khác xung quanh) Vì vậy, bất kỳ được chia sẻ nên được khai báo trong phụ huynh. – skaffman

+0

Cảm ơn bạn rất nhiều, tôi đã không nhận thức được điều đó. Tôi đã sửa cấu hình của mình cho phù hợp và giờ đây tất cả đều hoạt động rực rỡ. :-) Cảm ơn bạn rất nhiều, và cảm ơn tất cả những lần khác bạn đã giúp tôi ở đây. Tôi chắc chắn cần phải mua cho bạn một vài loại bia đôi khi :-) – niklassaers

1

Tệp web.xml của ứng dụng cơ bản Spring MVC không có ContextLoaderListener? Xem https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/src/main/webapp/WEB-INF/web.xml.

Lý do tôi hỏi là vì tôi nhận được lỗi sau đây trong ứng dụng của tôi:

ERROR [[Spring MVC Dispatcher Servlet]] Servlet.service() cho servlet Spring MVC Dispatcher Servlet ném ngoại lệ java.lang .IllegalStateException: Không có WebApplicationContext found: không có ContextLoaderListener đã đăng ký?

và tôi không có ContextLoaderListener (có khả năng gây ra sự cố).

Bất kỳ suy nghĩ nào về lý do tại sao ứng dụng cơ bản MVC sẽ hoạt động?

+0

Tác phẩm cơ bản mvc này vì nó chỉ sử dụng bộ lọc org.springframework.web.filter.CharacterEncodingFilter và bộ lọc này không cần bối cảnh ứng dụng mùa xuân hoạt động. –

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