我正在寻找一种自定义默认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
粘合剂注释,但我不确定这是否真的是这个场景的正确选择。
最好的方法是什么?
答案 0 :(得分:11)
这很容易。您可以使用转换器(其工作方式类似于PropertyEditors但无状态)。
请参阅Spring参考中的5.5 Spring 3 Type Conversion章节。
如果此类转换器已注册一次,您不需要任何其他信息,只需使用
即可@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 anntoation注册所有Beans的“助手”
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);
}
}
答案 1 :(得分:10)