2014-03-03 11 views
1

我想重定向到前一頁是一個域對象是無效的。例如,使用Address的域對象。Spring MVC轉發到新的URL保持現有

@Autowired 
private Address address; 
@RequestMapping(method = RequestMethod.GET) 
public String addressPage(
    ModelMap model 
) throws StdAddFault { 
    model.addAttribute("address", address); 
    return TILE_GET_STARTED_ADDRESS; 
} 
@RequestMapping(value = "/validate", method = RequestMethod.POST) 
public String selectAddress(
    @Valid Address address, 
    BindingResult result, 
    Model model, 
    HttpSession session 
) throws StdAddFault { 
    if(result.hasErrors()) { 
    model.addAttribute("address", address); 
    return "/address"; 
    } 
    ... 
} 

問題是在請求之後,而不是/地址是/ address/validate。這似乎有點誤導,但如果我使用重定向或轉發,我失去了我的信息。

有沒有什麼辦法使控制器/地址後的url(僅適用於無效數據)?

更新

我證實了上述不起作用。這確實有效,但我擔心一個請求可能會覆蓋另一個地址。這是一個有效的關注嗎?

if(result.hasErrors()) { 
    this.address = address; 
    return "redirect:/get-started/address"; 
} 
+0

您確定你沒有登錄重定向信息嗎?通常情況下,如果您將它們添加到模型中,然後重定向它們將保留。 –

+0

我會仔細檢查並確認。我得到它使用this.address =地址和重定向,但我不知道這將如何在生產中工作。例如,如果發送多個請求,每個請求都有一個實例,或者一個實例會覆蓋另一個實例。 – Jackie

+0

您可以添加您的地址對象作爲請求的屬性和使用正,這將生動地表現了對象,然後在控制器「/驗證」得到請求對象 –

回答

0

該注入@ModelAttribute("address") Address address的答案我終於去了

@Controller 
@RequestMapping("/address") 
public class AddressController { 
    private String getMainPage(
    ModelMap model, 
    HttpSession session 
){ 
    if(!model.containsAttribute("address")) 
     model.addAttribute("address", new Address()); 
... 
    return TILE_GET_STARTED_ADDRESS; 
} 

@RequestMapping(value = URL_ADDRESS_SELECT, method = RequestMethod.POST) 
public String validateAddress(
    @Valid Address address, 
    BindingResult result, 
    Model model, 
    RedirectAttributes attr, 
    HttpSession session 
) throws StdAddFault { 
    if(result.hasErrors()) { 
    attr.addFlashAttribute("org.springframework.validation.BindingResult.address", result); 
    attr.addFlashAttribute("address", address); 
    return "redirect:/address"; 
    } 
    .... 
} 
} 

This問題+你們幫我出了一大堆!

0

我能做到這一點的2種方式之一,但我不知道要使用哪一個..

1)這裏

if(result.hasErrors()) { 
    this.address=address; 
    return "redirect:/get-started/address"; 
} 

我擔心使用自動裝配Autowired周圍對象生命週期運轉。一個電話可以覆蓋另一個地址嗎?

另一種選擇是使用會話...

private String getMainPage(
    ModelMap model, 
    HttpSession session 
){ 
    if(session.getAttribute("address") == null){ 
    session.setAttribute("address", new Address()); 
    } 
    model.addAttribute("mainNav", MAIN_NAV); 
    model.addAttribute("subNav", SUB_NAV); 
    model.addAttribute("address", session.getAttribute("address")); 
    return TILE_GET_STARTED_ADDRESS; 
} 

我真的想避免會話雖然。

+0

我認爲,如果你做的第一個方法,你將覆蓋地址,因爲類實例化只有一次這樣在第一次請求之後,如果對結果有些錯誤,這將覆蓋您可以設置的更改地址 –

+0

其他的事情地址Bean的範圍到原型,所以每次請求都會發出一個新的地址obj –

+0

http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html #beans-factory-scopes-prototype –

0

好的,每次讓你的Controller實現BeanFactoryAware的時候都會得到一個新的對象。

然後實現方法setBeanFactory就像這樣。

private Address address. 

public void setBeanFactory(BeanFactory context) { 
    address = (Address)context.getBean("myAddress"); 
    } 

所以每次調用此setBeanFactory會得到一個地址對象,因爲範圍=原型將是一個新的對象。

+0

也許它可以爲此工作 –

2

我認爲你所追求的是存儲在會話中的「地址」模型屬性。這將保留唯一的地址對象每個用戶會話

@Controller 
@SessionAttributes({"address"}) 
@RequestMapping("/address") 
public class AddressController { 

    /** 
    * Injected model reference will contain 'address' if it exists in session 
    */ 
    @RequestMapping(method = RequestMethod.GET) 
    public String addressPage(Model model) { 
    if(!model.containsAttribute("address")) 
     model.addAttribute("address", new Address()); 
    return "address"; 
    } 

    /** 
    * This handler maps to form selecting/updating the address object 
    * at the end of this method the address object is automatically 
    * stored in session 
    */ 
    @RequestMapping(value = "/validate", method = RequestMethod.POST) 
    public String selectAddress(@ModelAttribute("address") Address address) { 
    // do stuff with the newly updated address.. 
    } 
} 

如果在其他任何處理程序,你需要的地址對象,所有你需要做的只是在參數

+0

如果有一些錯誤怎麼辦。因爲它們在BindingResult中。有沒有辦法仍然通過這些? – Jackie

+0

另外我如何使用@valid註釋進行驗證 – Jackie

+0

當然,綁定錯誤仍然會按照Spring文檔工作。對不起,使用@Valid註解超出了你的問題的範圍,請找到另一個線程,我確信它之前已經被問過許多次了。 – gerrytan