2015-09-09 119 views
10

在我的控制器中,我有String參數,包含一些id,不應該爲空字符串。我想知道,有沒有什麼辦法來檢查它不是空的@RequestMapping參數中的字符串? 我試圖在某些方面解決它如何檢查請求參數是否爲空@RequestMapping參數中的字符串?

@RequestMapping(value = someURL, params = {"id"}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

@RequestMapping(value = someURL, params = {"!id="}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

@RequestMapping(value = someURL, params = {"!id=\"\""}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 

沒有成功。 據我所知,params = {"id"}@RequestParam(required = true)只能檢查參數id在請求(!= null)中出現。

這是最有可能的,我必須檢查與控制器欽傑代碼,就像

if (id == null || id.isEmpty()) { 
    return someErrorResponse; 
} 

,但如果我錯了,請大家指正。 在此先感謝。

P.S.我的應用程序在Apache Tomcat 7.0.62容器上的Java 1.7 SE上運行

回答

6

給出根據消耗的是註釋

org.springframework.web.servlet.mvc.annotation.ServletAnnotationMappingUtils.checkParameters(String[], HttpServletRequest) 

像這樣的東西應該工作的春天代碼:

@RequestMapping(value = someURL, params = {"id!="}) 
public SomeResponse doSomething(@RequestParam(required = true) String id) 
+0

我注意到'required = true'甚至不是必須的,因爲當我離開標題字段時,我得到了狀態400:'{「status」:400,「error」:「Bad Request」,「exception」:「 org.springframework.web.bind.ServletRequestBindingException「,」message「:」Missing request header'X-Custom-Header'for method parameter of String「,」path「:」/ api /「}' – user3105453

+0

謝謝,我想這是我需要的。當我按照你提出的方式定義註釋時,在控制器方法的開始處放置斷點並進行測試,我沒有進入控制器方法; b)得到自我解釋的異常org.springframework.web.bind.UnsatisfiedServletRequestParameterException:實際請求參數未滿足參數條件「id!=」:id = {}。 – WeGa

7

如果您希望成爲符合驗證的Java EE,請使用@Size(min=1)

Hibernate驗證器有@NotEmpty爲此目的的註釋。但這不是Java規範的一部分。

順便說一句,保持required=true與上述通知不會強制請求中的param的存在。在評論

編輯反應:

春天是,如果你有類路徑中的某些Java EE驗證API implmentor的Java EE兼容的驗證,所以@Size註釋應該工作。到目前爲止,我只使用了hibernate驗證器。所以,你可以通過添加這個到classpath中啓用這些驗證功能:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.2.1.Final</version> 
</dependency> 

比你可以用@Validated註解註釋你的控制器和做到這一點:

@RequestMapping(value = someURL, params = {"id"}) 
public SomeResponse doSomething(@RequestParam(required = true) @Size(min=1) String id) 

您還可以自定義錯誤消息會被髮送給客戶。

如果您對Java EE驗證不熟悉,我會建議開始研究它,因爲如果您正在創建REST/HTTP端點,它是非常重要的。它會爲你打開新的世界。

Start with Java EE Tutorial for validation

Relevant part of Spring doc

+0

感謝您的答覆。我已經用我的環境描述更新了我的帖子。我不確定它與您提供的解決方案是否兼容。請告訴我,如果輸入參數違反了這些註釋約束,會發生什麼情況?在這種情況下我應該如何處理這種情況? – WeGa

-4

您可以使用defaultValue作爲

@RequestParam(value = "id", required = true, defaultValue = "-1") String id 

但是,你又必須使用的,如果像

if(id.equals("-1")){ 
    return "someErrorPage" 
} 

否則,您可以創建這是一個過濾器OSE,如本例

How to use a servlet filter in Java to change an incoming servlet request url?

+0

不是很有幫助... –

+0

感謝您的回覆。但是,不是我的手動參數檢查比您的解決方案更好嗎? – WeGa

+0

不僅「不是很有幫助」,而且顯然是錯誤的。 'defaultValue'僅在未指定參數時使用,不包含「空白」情形。 – kryger

相關問題