2

MVC アプリケーション内でクリーンな URL マッピングを構築しようとしていますが、次のような一般的な URL がたくさん見つかりました。

/SITE/{city}-{language}/user/{userId}

@RequestMapping(value = "/{city}-{language}/user/{userId}", 
         method = RequestMethod.GET)
public String user(@PathVariable String city, 
                   @PathVariable String language, 
                   @PathVariable String userId, 
                   Model model) {}

/SITE/{city}-{language}/comment/{userId}-{commentId}

@RequestMapping(value = "/{city}-{language}/comment/{userId}-{commentId}",
         method = RequestMethod.GET)
public String comment(@PathVariable String city,
                      @PathVariable String language, 
                      @PathVariable String userId,
                      @PathVariable String commentId, 
                      Model model) {}

フィルターの @PathVariable の代わりに、都市と言語を自動的にモデルに自動バインドする方法はありますか? @RequestMapping 関数のパラメーター数を減らすので、そうすると思います。

4

2 に答える 2

1

共通のパラメーターをマップする抽象基本クラスを作成しました。

public abstract class AbstractController {

    @ModelAttribute("currentCity")
    public CityEntity getCurrentCity(@PathVariable CityEntity city) {
        //CityEntity via a converter class
        return city;
    }

    @ModelAttribute("language")
    public String getLanguage(@PathVariable String language) {
        return language;
    }
}

これで、2 つの共通属性がモデル オブジェクトで使用できるようになります

@RequestMapping(value = "/{city}-{language}")
public class UserController extends AbstractController {

      @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET)
      public String user(@PathVariable String userId, 
               Model model) {...}

}
于 2013-01-19T19:36:22.383 に答える
0

タイプごとに Interface Converterを実装するだけで済みます。

例えば

public class StringToCityConverter<String, City> {
    ...
    public City convert (String cityName) {
        return this.cityDao.loadByCityName(cityName);
    }
}

そして、それらを登録する必要があります。1 つの方法は、Formatter Registrar を使用することです。

フォーマッタを登録するレジストラ

public class MyRegistrar implements FormatterRegistrar {
    ...
    @Override
    public void registerFormatters(final FormatterRegistry registry) {
        registry.addConverter(new StringToCityConverter(cityDto));
    }
}

そして、これはレジストラを登録します

<!-- Installs application converters and formatters -->
<bean id="applicationConversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatterRegistrars">
        <set>
            <bean
                class="MyRegistrar" autowire="byType" />                               
        </set>
    </property>
</bean>

次に、次のようにコントローラーを記述できます。

@RequestMapping(value = "/{city}-{language}/comment/{userId}-{commentId}",
     method = RequestMethod.GET)
public String comment(@PathVariable City city, ... Model model) {}
于 2013-01-07T18:44:00.223 に答える