2011-08-26 3 views
5

내 프로젝트에는 이전의 주석이 달린 컨트롤러와 새로운 주석 기반 컨트롤러가 포함되어 있습니다.주석이 달린 컨트롤러가있는 <mvc : annotation-driven />

최신 스프링 jar (3.0.5)를 사용 중이며 디스패처 - servlet.xml에 <mvc:annotation-driven />이 있습니다.

<mvc:annotation-driven />은 dispatcher-servlet.xml의 컨트롤러 bean의 name 속성을 통해 요청 매핑이 작동하지 않는 주석 처리되지 않은 컨트롤러로 연결되는 문제입니다.

org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/some_path/some_page.htm] in DispatcherServlet with name 'dispatcher' 

가 어떻게 그들이으로 해제 주석 컨트롤러를 유지하지만, 자신의 (이전 스타일) 매핑을 인식하는 봄을 알 수 있습니다 : 나는 다음과 같은 오류 메시지를 얻고 컨트롤러를 유엔 - 주석?

저는 이미 가지고있는 컨트롤러의 Java 코드를 최소한으로 변경하여 솔루션을 찾고 있습니다.

감사합니다.

답변

6

<mvc:annotation-driven />을 구성에 추가하면 기본 처리기 매핑 및 처리기 어댑터 집합이 바뀌며 그 기본값은 구식 컨트롤러를 처리 한 기본값입니다.

두 가지 옵션이 있습니다. 시도 할 것이다 첫번째 것은 <mvc:annotation-driven />를 제거하기위한 것이다. 이것을 사용하지 않고도 주석이 달린 컨트롤러를 사용할 수 있습니다. Jackson JSON 지원과 같은 추가 기능을 추가하지만 추가 기능이 필요하지 않으면 필요하지 않습니다. 따라서 <mvc:annotation-driven />없이 앱을 사용해보고 여전히 작동하는지 확인하십시오.

실패하면 이전 컨트롤러의 매핑과 어댑터를 복원 할 수 있습니다. 당신은 당신의 컨트롤러가 해당 URL이 매핑 된 것으로 사용하는 방법을 말하지만, 당신의 설정에 다음을 추가하지 않았다

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
<bean class="org.springframework.web.servlet.handler.ControllerClassNameHandlerMapping"/> 

당신이 그 이미 작업을해야 SimpleUrlHandlerMapping을 사용합니다.

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

그냥 맹목적으로 다음을 추가하지 마십시오 :

은 또한에 다시 HandlerAdapter을 추가해야합니다. 개별적으로 시도해보고 기존 컨트롤러가 새 컨트롤러와 함께 작동하도록하려면 최소 설정이 무엇인지 확인하십시오.

+0

매우 도움이되는 답변에 감사드립니다. 이전 컨트롤러는 매핑에 name = url 메서드를 사용하여 dispatcher-servlet.xml에 BeanNameUrlHandlerMapping을 추가했으며 이제는 다시 작동합니다.당신의 대답에 이어 나는 핸들러 맵핑과 핸들러 어댑터에 대해 읽을 시간을 가졌다. 이제 Spring 3에서 핸들러 매핑과 핸들러 어댑터가 자동으로 정의 되었습니까? 나는 DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter하지만 다른 어떤 것 같아? 설명서 및/또는 코드에서 언급 된 부분으로 안내해 줄 수 있습니까? 다시 한 번 감사드립니다! – rapt

6

mvc : annotation-driven을 실제 대체물로 폭발시킴으로써 쉽게 알아낼 수 있다는 것을 알았습니다. 이것에

<mvc:annotation-driven />이 폭발 : 마법이 사라졌다되면, 내가 "올드"컨트롤러로드하려고이 오류가 발생했습니다

<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" /> 
     </list> 
    </property> 
</bean> 

<!-- Configures a validator for spring to use --> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="messageInterpolator"> 
     <bean class="com.eps.web.spring.validation.SpringMessageSourceMessageInterpolator" /> 
    </property> 
</bean> 

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

: 그 시점에서 javax.servlet.ServletException: No adapter for handler [or[email protected]

을, 나는

추가
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 

그리고 내 모든 오래된 컨트롤러가 작동했습니다.

+0

고맙습니다, Brad, 솔루션입니다. 그것은 나를 위해 일했습니다. 흥미로운 점은 "mvn : annotation-driven"을 구성에 넣으면 "Application redirecting loop"라는 오류 메시지가 표시되지만 분해 된 버전이 정상적으로 작동하고 있다는 것입니다. –

+0

이전 컨트롤러에 SimpleUrlHandlerMapping을 사용하고있었습니다. 스프링 2.5. 주석을 달고 이전 컨트롤러를 다음과 같이 추가하면 케이크 조각처럼 작동합니다! <컨텍스트 : 성분 -scan base-package = "[your package]"/> \t . 감사! – JackDev

+0

당신의 솔루션이 왜 효과가 있었는지 찾고있는 사람이 있습니까? Spring이 기본 어댑터 세트와 함께 제공 되었기 때문에 "AnnotationMethodHandlerAdapter"단순 정의가 기본 어댑터 설정을 덮어 썼습니까? – JackDev

관련 문제