如何将IP地址绑定到Spring 3 @ModelAttribute?

hle*_*one 3 java spring spring-mvc

这是我的方法的样子:

@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";
}
Run Code Online (Sandbox Code Playgroud)

所以,我需要将IP地址绑定Foo可能通过调用对象getRemoteAddr()HttpServletRequest.我试图创建CustomEditorFoo,但它似乎并没有被正确的方法.@InitBinder看起来更有希望,但我还没有发现如何.

IP地址在对象上是必需的,而Spring与JSR-303 bean验证相结合将产生验证错误,除非它存在.

解决这个问题最优雅的方法是什么?

axt*_*avt 7

您可以使用@ModelAttribute-annotated方法使用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
}
Run Code Online (Sandbox Code Playgroud)

编辑:有一种方法@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());
}
Run Code Online (Sandbox Code Playgroud)