以下是我的方法的样子:
@RequestMapping(value = "/form", method = RequestMethod.POST)
public String create(@ModelAttribute("foo") @Valid final Foo foo,
final BindingResult result, final Model model) {
if (result.hasErrors())
return form(model);
fooService.store(foo);
return "redirect:/foo";
}
因此,我需要通过调用Foo
上的getRemoteAddr()
将IP地址绑定到HttpServletRequest
对象。我尝试为CustomEditor
创建Foo
,但这似乎不是正确的方法。 @InitBinder
看起来更有希望,但我还没有发现如何。
对象必须使用IP地址,而Spring与JSR-303 bean验证相结合将产生验证错误,除非它存在。
解决这个问题最优雅的方法是什么?
答案 0 :(得分:7)
您可以使用@ModelAttribute
- 带注释的方法使用IP地址预填充对象:
@ModelAttribute("foo")
public Foo getFoo(HttpServletRequest request) {
Foo foo = new Foo();
foo.setIp(request.getRemoteAddr());
return foo;
}
@InitBinder("foo")
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("ip"); // Don't allow user to override the value
}
编辑:有一种方法只能使用@InitBinder
:
@InitBinder("foo")
public void initBinder(WebDataBinder binder, HttpServletRequest request) {
binder.setDisallowedFields("ip"); // Don't allow user to override the value
((Foo) binder.getTarget()).setIp(request.getRemoteAddr());
}