Как привязать IP-адрес к Spring 3 @ModelAttribute? - PullRequest
3 голосов
/ 24 февраля 2010

Вот как выглядит мой метод:

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

Итак, мне нужно привязать IP-адрес к объекту Foo, возможно, вызвав getRemoteAddr() на HttpServletRequest. Я пытался создать CustomEditor для Foo, но это не совсем правильно. @InitBinder выглядит более многообещающе, но я еще не выяснил, как.

IP-адрес является обязательным для объекта, и Spring в сочетании с проверкой bean-компонента JSR-303 выдаст ошибку проверки, если она не существует.

Какой самый элегантный способ решить эту проблему?

1 Ответ

7 голосов
/ 24 февраля 2010

Вы можете использовать @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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...