2010-09-12 26 views
15

Cho đến nay, <mvc:annotation-driven /> đã gây ra nhiều rắc rối cho tôi, vì vậy tôi muốn loại bỏ nó. Mặc dù spring framework docs clearly say what it is supposed to be doing, danh sách các thẻ thực sự tóm tắt <mvc:annotation-driven /> vẫn còn thiếu.Làm thế nào để loại bỏ <mvc: chú thích hướng />?

Vì vậy, tôi đang mắc kẹt với loại bỏ <mvc:annotation-driven /> và bây giờ nhận được lỗi

WARN osweb.servlet.PageNotFound - Không có ánh xạ tìm thấy cho yêu cầu HTTP với URI [/ webapp/học viên] trong DispatcherServlet với tên 'workoutsensor'

cho tất cả các url phải được giải quyết bằng các lớp điều khiển (trong trường hợp này: ./trainees). Bất kỳ đề xuất nào tôi có thể đọc thêm về <mvc:annotation-driven />? Tôi tuyệt vọng muốn biết chính xác những thẻ nào được đại diện bởi <mvc:annotation-driven />.

Trả lời

26

Bạn có thể sử dụng BeanPostProcessor để tùy chỉnh từng hạt được xác định bởi <mvc:annotation-driven />. Các javadocs bây giờ chi tiết tất cả các bean tag đăng ký.

Nếu bạn thực sự muốn thoát khỏi nó, bạn có thể xem mã nguồn của org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

Và bạn có thể xem đậu nó được xác định. Tôi đã làm điều này 'tập thể dục' (không phải cho tất cả trong số họ, nhưng đối với những người tôi cần), vì vậy đây là họ:

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

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="webBindingInitializer"> 
      <bean class="com.yourpackage.web.util.CommonWebBindingInitializer" /> 
     </property> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> 
       <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /> 
       <!-- bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /--> 
      </list> 
     </property> 
    </bean> 
<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 

Bây giờ, ở trên bạn thấy CommonWebBindingInitializer. Bạn phải tạo lớp này, để sử dụng chuyển đổi và xác thực:

public class CommonWebBindingInitializer implements WebBindingInitializer { 

    @Autowired 
    private Validator validator; 

    @Autowired 
    private ConversionService conversionService; 

    @Override 
    public void initBinder(WebDataBinder binder, WebRequest request) { 
     binder.setValidator(validator); 
     binder.setConversionService(conversionService); 
    } 

} 

Và điều này làm việc tốt cho tôi cho đến nay. Vui lòng báo cáo bất kỳ vấn đề nào với nó.

+0

Cảm ơn Bozho, đó chỉ là đầu vào tôi cần. Tôi khá chắc chắn rằng tôi sẽ chạy vào các vấn đề cấu hình thêm, đặc biệt, thực hiện . Tôi sẽ không ngần ngại báo cáo cho họ ;-) –

+1

Ah, có liên kết Fisheye tôi đang tìm kiếm. :] – earldouglas

+1

Nguồn BTW 'AnnotationDrivenBeanDefinitionParser' cũng có thể được xem tại GitHub: https://github.com/cbeams/spring-framework/blob/master/org.springframework.web.servlet/src/main/java/org/springframework /web/servlet/config/AnnotationDrivenBeanDefinitionParser.java –

5

Nếu bạn muốn tránh thẻ mvc:annotation-driven, bạn có thể chỉ cần tự tạo DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter đậu, nhưng có vẻ như tốt hơn bạn nên truy cập gốc rễ của sự cố với chính thẻ.

Các triệu chứng của sự cố của bạn là gì? Bạn đang cố gắng làm gì với ứng dụng Spring MVC?

Nếu bạn muốn biết điều gì đang diễn ra dưới bìa khi bạn sử dụng mvc: hướng chú thích, hãy xem phương pháp AnnotationDrivenBeanDefinitionParser.parse().

+1

"Các triệu chứng của vấn đề của bạn là gì?" - O, nó chỉ là bất cứ khi nào tôi tùy chỉnh một giao diện bảo mật mùa xuân (ví dụ: UserDetailsManager) tôi nhận được một lỗi "được xác định kép".Hoặc khi tôi cố gắng và xác định các khía cạnh của riêng tôi, tôi không bao giờ đọc vì mùa xuân sử dụng riêng của nó. Hơn nữa, tôi cảm thấy tốt hơn có một số kiểm soát nhiều hơn những gì tôi mã. Convention-over-configuration là một điều tuyệt vời ... nếu bạn biết quy ước là gì ;-) –

3

Câu hỏi cũ tôi biết, nhưng điều này có thể giúp ai đó. Nhờ các bài đăng trên trang này và cũng có over here, tôi đã sử dụng phần sau để thay thế thẻ được chú thích theo định hướng trong ứng dụng Roo 1.2. Họ kicker cho tôi đã cần chuyển đổi loại hỗ trợ trong chế độ xem danh sách ứng dụng roo.

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

<bean id="conversionServiceExposingInterceptor" 
    class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor"> 
    <constructor-arg ref="conversionService" /> 
</bean> 

<bean 
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="order" value="0" /> 
    <property name="interceptors"> 
     <list> 
      <ref bean="conversionServiceExposingInterceptor" /> 
     </list> 
    </property> 
</bean> 

<bean 
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean 
      class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService" /> 
      <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" /> 
     </list> 
    </property> 
</bean> 
+0

Mùa xuân 3.1 giới thiệu [lớp hỗ trợ mới] (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html# mvc-ann-requestmapping-31-vs-30) cho @RequestMapping nên được sử dụng "để tận dụng các tính năng mới của Spring MVC 3.1". Đã cập nhật ví dụ này. – sbk

2

Trong khi ghi đè, hãy cẩn thận xem xét tùy chọn ghi đè quản lý thực thi tùy chỉnh. Nếu không, tất cả ánh xạ ngoại lệ tùy chỉnh của bạn sẽ không thành công. Bạn sẽ phải sử dụng lại messageCoverters với một bean danh sách:

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

<util:list id="messageConverters"> 
    <bean class="your.custom.message.converter.IfAny"></bean> 
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
</util:list> 

<bean name="exceptionHandlerExceptionResolver" 
     class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"> 
    <property name="order" value="0"/> 
    <property name="messageConverters" ref="messageConverters"/> 
</bean> 

<bean name="handlerAdapter" 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="conversionService" ref="conversionService" /> 
      <property name="validator" ref="validator" /> 
     </bean> 
    </property> 
    <property name="messageConverters" ref="messageConverters"/> 
</bean> 

<bean id="handlerMapping" 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
</bean> 
Các vấn đề liên quan