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

时间:2010-02-24 17:58:29

标签: 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";
}

因此,我需要通过调用Foo上的getRemoteAddr()将IP地址绑定到HttpServletRequest对象。我尝试为CustomEditor创建Foo,但这似乎不是正确的方法。 @InitBinder看起来更有希望,但我还没有发现如何。

对象必须使用IP地址,而Spring与JSR-303 bean验证相结合将产生验证错误,除非它存在。

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

1 个答案:

答案 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());
}