2

利用可能な Spring の最新バージョン (3.1.1) を使用するようにアプリケーションをアップグレードすると、REST 呼び出しの 1 つが 404 エラーをスローすることがわかりました (以前は完全に成功していました)。コードを変更せずに、古いライブラリ (3.0.3) への切り替えと新しいライブラリへの切り替えが失敗することを確認しました。

@Controller
@RequestMapping("/group/{groupId}/template")
public class TemplateController extends AbstractController {
    ...

    @RequestMapping(value="/{templateId}", method=RequestMethod.GET) @ResponseBody
    public Template getTemplate(ServletWebRequest request, 
            @PathVariable("groupId") int groupId, 
            @PathVariable("templateId") int templateId) throws Exception {
        ...
    }

    ...

    @RequestMapping(value="/{templateId}", method=RequestMethod.DELETE) @ResponseBody
    public Task getTemplate(ServletWebRequest request, 
            @PathVariable("groupId") int groupId, 
            @PathVariable("templateId") int templateId) throws Exception {
        ...
    }

    ...
}

比較のためだけに GET メソッドを挿入しましたが、うまくいきました。ただし、DELETE メソッド (以前は機能していました) を要求すると、ログに次のようなエラーが返されます。

WARNING: No mapping found for HTTP request with URI [/*appname*/group/1/template/group/1/template/1] in DispatcherServlet with name '*appname*'

エラーは明らかに正しく、そのマッピングの URI はありませんが、指定されたマッピング ( /*appname*/group/1/template/1) ではなく、そのマッピングを見つけようとするのはなぜですか?

4

2 に答える 2

0

値の / をルートとして扱うには、メソッド @RequestMapping の値の / を削除してマッピングを試みます。

@RequestMapping(value="{templateId}", method=RequestMethod.DELETE) @ResponseBody
    public Task getTemplate(ServletWebRequest request, 
            @PathVariable("groupId") int groupId, 
            @PathVariable("templateId") int templateId) throws Exception {
        ...
    }
于 2012-08-16T22:43:06.153 に答える
0

表示されたエラーが発生した理由がまだわからないため、Spring の内部の仕組みについての洞察をいただければ幸いですが、何が原因であるかを突き止めました。他のメソッドとは対照的に、そのメソッドの唯一の違いは、例外をスローしていたのに対し、他のメソッドはスローしていなかったことです。ExceptionHandler をコメントアウトした後、関数は正しく登録されました。

@ExceptionHandler(Exception.class)
public Map<String, String> handleExceptions(Exception e) {
    ...
}

これが原因でエラーが発生した理由はまだよくわかりませんが、皮肉なことに、これが最初にライブラリをアップグレードした理由でした。例外処理が正しく機能するようにするためです。関数に追加@ResponseBodyした後 (最初に実行するつもりでした)、すべてがうまくいきました。

于 2012-08-17T15:06:05.310 に答える