2010-02-24 59 views
3

這裏是我的方法是如何的樣子:如何將IP地址綁定到Spring 3 @ModelAttribute?

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

所以,我需要大概通過調用HttpServletRequestgetRemoteAddr()到IP地址Foo對象綁定。我已經嘗試爲Foo創建CustomEditor,但它似乎不是正確的方法。 @InitBinder看起來更有希望,但我還沒有找到如何。

該對象上的IP地址是強制性的,Spring與JSR-303 bean驗證組合會產生驗證錯誤,除非它存在。

什麼是最優雅的方式來解決這個問題?

回答

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 
} 

編輯:有一種方法使用@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()); 
} 
+1

非常感謝,我從來沒有在Spring文檔中看到過這樣的例子。我選擇了第一種方式,因爲純粹的'@ InitBinder'方式在鑄造方面看起來有些笨拙。 – hleinone 2010-02-24 22:34:45

相關問題