2011-09-14 2 views
1

シンプルなリクエストをリンクで作成し、@RequestMappingの設定が期待通りに動作しないシナリオがあります。私は次のパターンとURLを参照アンカータグ内 RequestMappingが複数レベルのURLで動作しない

'/アクションプラン/エクスポート/ PDF?トークン= xxxは&のtaskId = 1111 &のtaskId = 2222 ...' 私のコントローラクラスI内

クラスレベルでこのマッピングを持っている:

@RequestMapping("/action-plan/export") 

そして、メソッドレベルでのこのマッピング

@RequestMapping(value="/pdf", method=RequestMethod.GET) 
public String exportToPdf(@RequestParam("taskId") String[] taskIds, 
      @RequestParam("token") String[] encryptedEmplId, ModelMap model) 

しかし、私はTHIをしようとするたびにsの私は404ページが見つからないというエラーと、次の春の例外を取得:

org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException:サーブレット要求が見つかりませんマッチングハンドラメソッド:パス「/ PDF」メソッド 'GET'、パラメータ '[taskId' - >配列['1962326'、 '1962264'、 '1962317'、 '1962328'、 '1962324'、 '1962325'、 '1962323'、 '1963147' '1962327'、 '1962318'、 '1962329'、 '1962330']、 'トークン' - >配列[ 'XXXX']]

私は削除するときに気づいた "/ PDFの?"メソッドの@RequestMappingから 'value = "/ pdf"'を削除しても問題ありません。私の人生のために、なぜ/ pdfをURLに追加してRequestMappingが動作しないのか分かりません。

+0

danny.lesnik感謝のDispatcherServlet – atrain

+0

のためのあなたのweb.xmlサーブレットマッピングを投稿してください私はあなただけ@RequestMapping(「/アクションプラン/エクスポート/ *」)に変更する必要があると考えていますスラッシュのない@RequestMapping(value = "pdf" ettc) – chrismarx

答えて

1

私はdanny.lesnikの答えはかなり近いと思っていますが、自分の答えを書いているので、もっと冗長にすることができます。

私は別のプロジェクトに取り組んでいましたが、上記がうまくいかない理由を理解しました。私の元の質問を参照するにはここでは関係のweb.xmlサーブレットマッピングです:

<servlet-mapping> 
    <servlet-name>spring-dispatcherServlet</servlet-name> 
    <url-pattern>/action-plan/export/*</url-pattern> 
</servlet-mapping> 

は私が気づいたものは何でも、私はweb.xmlののRequestMapping値の評価には含まれていませんでしたに含まパスの一部。たぶん誰かが私のために、この詳細にいくつかの光を当てることができ

<bean id="annotationHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <property name="order" value="2"/> 
     <property name="alwaysUseFullPath" value="true"/> 
</bean> 

:私は、このBeanの構成がそのシナリオを(「alwaysUseFullPath」プロパティに注意してください)を防止しているだろうと思っているだろう。いずれの場合においても

0

問題を再現し、.action拡張を使用してサーブレットをマッピングすることで解決しました。例えば

@Controller 
@RequestMapping(value="/test") 
public class DefaultController { 

    @RequestMapping(value="/pdf.action", method=RequestMethod.GET) 
    public ModelAndView indexView(@RequestParam("taskId") String[] taskIds, 
      @RequestParam("token") String[] encryptedEmplId){ 
     ModelAndView mv = new ModelAndView("index"); 
    return mv; 
    } 

春XMLマッピング:

<context:annotation-config /> 
<context:component-scan base-package="com.vanilla.controllers" /> 

<bean id="viewResolver" 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<property name="prefix"> 
<value>/</value> 
</property> 
<property name="suffix"> 
<value>.jsp</value> 
</property> 
</bean> 

このweb.xmlのサーブレットマッピング

<display-name>SpringMvcServlet</display-name> 
    <servlet> 
    <servlet-name>SpringMvcServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>SpringMvcServlet</servlet-name> 
    <url-pattern>*.action</url-pattern> 
    </servlet-mapping> 

このコードはこのURL

/テストを解決します/pdf.actio n?token = 3 & token = 4 & taskId = 4

完璧です。

+0

@RequestMapping(value = "/ test/level2")のように、クラスレベルのURLに別のレイヤーを追加すると、ソリューションは機能しますか? – JJensL

+0

仕事をしたら、気軽に試してみてください。 –

+0

私は別のプロジェクトに取り組んでいて、あなたの答えを幾分確認しました。私の元の質問を参照するには、関連するweb.xmlサーブレットマッピングがあります: ' spring-dispatcherServlet /action-plan/export/* 'と入力します。 – JJensL

関連する問題