最近、次のようなSpring3.0コントローラーの処理に移行しました。
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST)
protected String onSubmit ( Form form, Errors errors) {
// handle POST
}
@RequestMapping(method = RequestMethod.GET)
protected void getForm ( Form form ) {
// handle GET
}
}
HEADリクエストが原因で、ログに多くの例外が発生しています。
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'HEAD' not supported
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.resolveHandlerMethod(AnnotationMethodHandlerAdapter.Java:621)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.Java:422)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.Java:415)
...
HEADリクエストはGETリクエストと同じ方法でサポートしたいのですが、もちろんHTTP参照に従います。
HEADメソッドはGETと同じですが、サーバーがいけない点が異なります。
応答でメッセージ本文を返します。 HEADリクエストに応答してHTTPヘッダーに含まれるメタ情報は、GETリクエストに応答して送信される情報と同一である必要があります。このメソッドは、によって暗示されるエンティティに関するメタ情報を取得するために使用できます。エンティティ本体自体を転送せずにリクエストします。このメソッドは、ハイパーテキストリンクの有効性、アクセス可能性、最近の変更をテストするためによく使用されます。 http://www.ietf.org/rfc/rfc2616.txt
誰かがエレガントな解決策を持っていますか、それともすぐに使える春の解決策さえありますか?
私はウェブを検索しましたが、これに対する答えは見つかりませんでした。
現在のSpring(4.3.10)では、HEADは自動的にサポートされます:
「GET」にマップされた@RequestMappingメソッドも暗黙的に「HEAD」にマップされます。つまり、「HEAD」を明示的に宣言する必要はありません。 HTTP HEADリクエストは、本文を書き込む代わりにバイト数と「Content-Length」ヘッダーセットのみがカウントされることを除いて、HTTPGETであるかのように処理されます。
私はこれがあなたが探しているものだと信じています: http://www.axelfontaine.com/2009/09/transparently-supporting-http-head.html
サポートされているメソッドとしてリクエストマッピングにHEAD
を追加するだけです。
@RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD})
更新:AnnotationMethodHandlerAdapter
をメソッドハンドラーとして拡張するカスタムクラスを提供できると思います(dispatcher-servlet.xml
)、HEADサポートチェックをバイパスします。しかし、IDEの置換機能を使用して追加します。