web-dev-qa-db-ja.com

春にカスタム変数にパス変数をバインドする

私のようなリクエストをモデル化するクラスがあります

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)にバインドする方法はありますか?

26
Senthil Babu

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()の例をご覧ください

30
Liang Zhou

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オブジェクトに入力する都市/場所の文字列を取得しようとします。

3
Paul Gray