Spring MVC привязка параметров настраиваемого метода - PullRequest
13 голосов
/ 29 июня 2011

Я ищу способ настроить привязку параметров Spring MVC по умолчанию. Возьмите этот метод в качестве примера:

@RequestMapping(value="/index.html")
public ModelAndView doIndex(@RequestParam String param) {
  ...

Это легко, когда у меня есть только String, который я хочу извлечь из запроса. Однако я хочу заполнить более полный объект, чтобы мой метод выглядел следующим образом:

@RequestMapping(value="/index.html")
public ModelAndView doIndex(Foo bar) {
  ...

То, что я ищу, - это способ объявить привязку, подобную этой;

@RequestMapping(value="/index.html")
public ModelAndView doIndex(@FooPopulator Foo bar) {
  ...

И есть какой-то другой тип разработчика (определяемый аннотацией @FooPopulator), который делает это:

public void doBind(Foo target, ServletRequest originalRequest) {
  target.setX(this.computeStuffBasedOn(originalRequest));
  target.sety(y);
}

До сих пор я узнал об аннотации связующего @InitBinder, но я не уверен, действительно ли это правильный выбор для этого сценария.

Какой лучший способ?

Ответы [ 2 ]

12 голосов
/ 29 июня 2011

Это очень легко. Вы можете использовать конвертеры (которые работают как односторонние PropertyEditors, но не сохраняют состояния).

См. Главу 5.5 Преобразование типов пружин 3 в справочнике Spring.

Если такой конвертер зарегистрирован один раз, вам не нужна дополнительная информация, вы можете просто использовать

@RequestMapping(value="/index.html")
public ModelAndView doIndex(@RequestParam Foo param) {

Например, простой конвертер, который загружает объект по его идентификатору:

@Component
@CustomConverter //custom qualifyer
public class BUdToUserConverter implements Converter<String, User> {

    @Resource
    private UserDao userDao;

    @Override
    public User convert(String source) {
        Integer id = Integer.parse(source);
        return this.userDao.getByBusinessId(id);
    }
}

«Помощник», который регистрирует все Бины с аннотацией @CustomConverter

public class ApplicationConversionServiceFactoryBean extends FormattingConversionServiceFactoryBean {

    @Resource
    @CustomConverter
    private List<Converter<?, ?>> customConverter;

     @Override
    protected void installFormatters(final FormatterRegistry registry) {
        super.installFormatters(registry);

        for (Converter<?, ?> converter : customConverter) {
            registry.addConverter(converter);
        }
    }
}

Как это использовать

UserController {
...
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public ModelAndView show(@PathVariable("id") User user) {        
        return new ModelAndView("users/show", "user", user);
    }
}
11 голосов
/ 29 июня 2011

просто быстрое спасибо и информация, что я нашел "правильное" решение проблемы.Spring уже предоставляет WebArgumentResolver для этого сценария.

http://sergialmar.wordpress.com/2011/03/29/extending-handler-method-argument-resolution-in-spring-mvc/

http://scottfrederick.blogspot.com/2011/03/customizing-spring-3-mvcannotation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...