gpt4 book ai didi

java - Spring MVC 自定义方法参数绑定(bind)

转载 作者:IT老高 更新时间:2023-10-28 13:56:23 28 4
gpt4 key购买 nike

我正在寻找一种自定义默认 Spring MVC 参数绑定(bind)的方法。以这个方法为例:

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

这很简单,当我只有一个想要从请求中提取的 String 时。但是,我想填充一个更完整的对象,以便我的方法如下所示:

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

我正在寻找的是某种方式来声明这样的绑定(bind);

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

到目前为止,我已经发现了 @InitBinderbinder 注释,但我不确定这是否真的是这个场景的正确选择。

最好的方法是什么?

最佳答案

这很容易。您可以使用转换器(其工作方式类似于 PropertyEditors,但它是无状态的)。

见章节5.5 Spring 3 Type Conversion在 Spring 引用中。

如果这样的转换器注册一次,你不需要任何额外的信息,你可以简单地使用

@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 注册所有 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);
}
}

关于java - Spring MVC 自定义方法参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6519322/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com