弹簧MVC定制方法参数绑定

2022-09-04 07:52:28

我正在寻找一种自定义默认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

最好的方法是什么?


答案 1

这很容易。您可以使用转换器(其工作方式类似于单向属性编辑器,但无状态)。

请参阅弹簧参考中的 5.5 章弹簧 3 类型转换

如果这样的转换器注册一次,则不需要任何其他信息,只需使用即可

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

例如,一个简单的转换器,它按对象的 id 加载对象:

@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的废弃来注册所有Bean。

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);
    }
}

答案 2

推荐