私のようなリクエストをモデル化するクラスがあります
class Venue {
private String city;
private String place;
// Respective getters and setters.
}
そして、会場に関する情報を取得するためにRESTful URLをサポートしたいと思います。だから私はこのようなコントローラメソッドを持っています。
@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) {
// code
}
個々のパラメーターをすべて取得する代わりに、春にパス変数をモデルオブジェクト(この場合はVenue)にバインドする方法はありますか?
Spring MVC
は、リクエストパラメータとパス変数をJavaBeanにバインドする機能を提供します。JavaBeanは、あなたの場合はVenue
です。例えば:
@RequestMapping(value = "/venue/{city}/{place}", method = "GET")
public String getVenueDetails(Venue venue, Model model) {
// venue object will be automatically populated with city and place
}
JavaBeanが機能するには、city
プロパティとplace
プロパティが必要であることに注意してください。
詳細については、spring-projects/spring-mvc-showcaseの withParamGroup()の例をご覧ください
HandlerMethodArgumentResolver
インターフェイスの実装を提供できます。このインターフェイスは主に、Springができない方法でコントローラーメソッドの引数を解決するために使用されます(これは基本的にあなたがやろうとしていることです)。これを実現するには、次の2つの方法を実装します。
_public boolean supportsParameter(MethodParameter mp) {
...
}
public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception {
...
}
_
以下を介してSpringコンテキストに実装を注入できます。
_<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
_
Springが解決できないパラメーターを検出すると、メソッドsupportsParameter()
を呼び出して、リゾルバーがパラメーターを解決できるかどうかを確認します。メソッドがtrueを返す場合、SpringはresolveArgument()
メソッドを呼び出して実際にパラメーターを解決します。このメソッドでは、NativeWebRequestオブジェクトにアクセスできます。このオブジェクトを使用して、contextPathを超えるパスを取得できます。 (あなたの場合:_/venue/{city}/{place}
_)リクエストパスを解析し、Venueオブジェクトに入力する都市/場所の文字列を取得しようとします。