2014-07-04 61 views
1

我正在開發一個Spring 3項目,並且總是檢查@ModelAttribute是否爲null,如果是的話,我將用戶重定向到一個錯誤頁面。Spring MVC:是否有必要測試@ModelAttribute是否爲null?

@Controller 
@SessionAttributes({"myCommand"}) 
public class MyController { 
    @ModelAttribute("myCommand") 
    public MyCommand populate(HttpServletRequest request) { 
    return new MyCommand(); 
    } 
    @RequestMapping(value="/user/saveFoo", method=RequestMethod.POST) 
    public String saveFoo(HttpServletRequest request, @ModelAttribute("myCommand") MyCommand myCommand) { 
    if(myCommand == null) { 
     // Add invalid session error here. 
     return "error.htm"; 
    } 
    ... 
    ... 
    } 
} 

我想知道的是如果這項檢查是必要的。該命令是一個會話屬性,並且在必要時使用控制器的填充方法創建。因此,只要會話處於活動狀態,命令就永遠不會爲空。

我不知道會話過期時會發生什麼。控制器是否再次創建模型屬性?如果是這樣,那麼無論會話的狀態如何,命令對象都不能爲空。

感謝您的任何幫助。

+0

我相信如果'@ ModelAttribute'來自會話,並且您沒有'@ModeAttribute'方法來創建一個'MyCommand',並且您的會話超時了,那麼它有可能是'null '。但是,這是一個簡單的測試。打開你的應用程序,在打開這個處理程序之前就着手處理它,讓它靜靜地等待,比如一個小時,或者任何你有會話超時的設置。繼續,看看你是否在那裏得到一個null(可能想把一個SOP放在那裏,所以你知道它是空的)。 – CodeChimp

回答

1

Spring MVC爲所有方法參數創建新實例可最大限度地減少控制器方法中空指針異常的潛在風險! 但請注意,這不適用於自定義爲HandlerMethodArgumentResolver的包裝類型和類,它們可以返回null作爲返回值。

要回答你的問題,Spring MVC實例化模型類的新實例,甚至會話過期。它永遠不能爲空!從ModelAttributeMethodProcessor的javadoc

報價:

模型屬性從模型中獲得,或者如果沒有發現可能與 一個默認的構造函數創建(如果可用)。

如果沒有默認構造函數可用Spring MVC拋出一個異常BeanInstantiationException

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [entity.Product]: No default constructor found 

您可以刪除所有空指針檢查安全。

爲了什麼Spring MVC可以在默認控制器方法處理,你應該看看代碼和javadoc在spring-web人工製品包裝org.springframework.web.method.annotationspring-webmvc人工製品在包裝org.springframework.web.servlet.mvc.method.annotation一個概述。

+0

感謝您的詳細解答,它確實有所幫助。 –

+0

很高興聽到! –

0

其實你可以有以下幾種:

@ModelAttribute("isNull") 
public T returnNull() { 
    return null; 
} 

@RequestMapping("/") 
public String go(@ModelAttribute("isNull") T isNull) { 
    return isNull ? "isNull" : "isNotNull"; 
} 

isNotNull視圖將被退回。