2011-08-26 5 views
5

私のプロジェクトには、古い注釈付きコントローラと、新しい注釈ベースコントローラが含まれています。注釈付きコントローラを使用した<mvc:annotation-driven />

私は最新のSpring jar(3.0.5)を使用していますが、ディスパッチャServlet.xmlには<mvc:annotation-driven />があります。

問題は、<mvc:annotation-driven />は、ディスパッチャサーブレット.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 />を設定に追加すると、ハンドラマッピングとハンドラアダプタのデフォルトセットが置き換えられます。これらのデフォルトは古いスタイルのコントローラを処理するものでした。

2つの選択肢があります。最初に試してみるのは、<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を使用した場合。

またに戻っHandlerAdapterを追加する必要があります。やみくもにこれらを追加しないでください

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

。それらを個別に試してみて、新しいコントローラーと一緒に古いコントローラーを動作させるための最小限の設定を確認してください。

+0

この非常に有益な回答をありがとう。以前のコントローラでは、マッピングにname = urlメソッドを使用していたので、dispatcher-servlet.xmlにBeanNameUrlHandlerMappingを追加しました。あなたの答えに続いて、私はハンドラマッピングとハンドラアダプタ(彼らについては知らなかった)について読む時間をとった。私の質問はSpring 3で、ハンドラマッピングとハンドラアダプタは自動的に定義されていますか?私はDefaultAnnotationHandlerMapping&AnnotationMethodHandlerAdapterだと思いますが他のものはありますか?ドキュメントやコードのどこに記載されているか教えてください。再度、感謝します! – rapt

6

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

:これまで

<mvc:annotation-driven />爆発その時点から javax.servlet.ServletException: No adapter for handler [or[email protected]

を、私は

を追加しました
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 

私のすべての古いコントローラが動作しました。

+0

ありがとう、ブラッド、あなたのソリューションです。それは私のために働いた。興味深いことに、私が "mvn:annotation-driven"を設定に入れると、 "Application redirecting loop"というエラーメッセージが表示されますが、爆発したバージョンは正常に動作しています。 –

+0

私は古いコントローラにSimpleUrlHandlerMappingを使用していました。 Spring 2.5で。 注釈付きのコントローラーと古いコントローラーの両方を有効にすると、ケーキのように機能します。 <文脈:コンポーネント-scan base-package = "[あなたのパッケージ]" /> \t 。ありがとう! – JackDev

+0

あなたのソリューションがなぜ機能するのかを見ている人はいますか? Springにはデフォルトのアダプタセットが付属していて、 "AnnotationMethodHandlerAdapter"という単純な定義はデフォルトのアダプタ設定を上書きしていたのでしょうか? – JackDev

関連する問題