2015-06-26 75 views
2

我是Spring和Rest端點的新手。Spring Rest RequestMethod.GET返回400錯誤請求@RequestParam required = true時丟失

我有一個控制器,它接受@RequestParam並返回JSON Response

默認情況下,@RequestParam required = "true",這是我需要它。

我使用Spring 3.1.3

這是在控制器我GET方法:

@Controller 
@RequestMapping("/path") 
public class MyController{ 
     @RequestMapping(value = "/search/again.do", method = RequestMethod.GET, produces = { 
     "application/json" 
    }) 
    public ResponseEntity<?> find(@RequestParam(value = "test", required = true) final String test) { 
     return new ResponseEntity<String>("Success ", HttpStatus.OK); 
    } 
} 

當我把它打端點請求PARAM,這是我期待得到。

?例如:路徑/搜索/ again.do測試= YES

一切都是完美的。

這是我遇到的問題:

當我將用該值缺少獲取:

實例:路徑/搜索/ again.do

我得到一個400錯誤請求。可能這是正確的。

但我想達到的是。 GET請求中缺少所需的值時。

因爲我可以發送一個JSON響應@RequestParam測試缺失。

任何人都可以指導我如何實現這一點。

我不知道我錯過了什麼。

在此先感謝。

回答

1

如果你仔細觀察你的代碼,你會發現答案正盯着你。只需將required更改爲false,您應該很好。當用戶未提供GET參數值test時,則可以返回特殊消息。

@Controller 
@RequestMapping("/path") 
public class MyController { 
    @RequestMapping(value = "/search/again.do", method = RequestMethod.GET, produces = { 
    "application/json" 
    }) 
    public ResponseEntity<?> find(@RequestParam(value = "test", required = false) final String test) { 
     if (test == null) { 
      return new ResponseEntity<String>("test parameter is missing", HttpStatus.OK); 
     } 
     else { 
      return new ResponseEntity<String>("Success ", HttpStatus.OK); 
     } 
    } 
} 
+0

感謝您的反饋。我知道我可以改變那個required = false,一切都按照我想要的方式工作。但是我希望required = true CONDITION在那裏,當任何人使用端點不發送該值時,通過發送一個他忘記發送測試值的響應來驗證該請求。我不想保留它的虛假。這不可能嗎? – Aniks

+0

設置'required = false'有什麼問題?如果參數丟失,該框架被設計爲拋出異常。如果你不想要這種行爲,那麼設置'required = false'並實現你自己的邏輯來處理它。 –

+0

我只是覺得,當我要求的價值=假。我給一個人進入終點。我知道我可以使用javax驗證並添加一些@Valid並通過給出錯誤消息來處理它,但我不知道我是否可以在RequestParams上執行此操作。 – Aniks

0

那麼如果你設置參數測試是必需的。如果沒有這個參數,U就不能發送請求。嘗試更改param required = false並處理方法中缺少的參數。您能給我們像if(test==null) throw new Exception("Param test missing")

+0

感謝您的反饋,我意識到這一點。我想知道沒有辦法驗證請求併發回錯誤消息。按要求保持該值= true。 通過使它成爲假,處理方法中對我沒有意義?可能這是不可能的,但我看到很多人都在問同樣的事情。 – Aniks

+2

你想在全球範圍內處理這個問題嗎?然後嘗試搜索spring文檔以進行異常處理。但是,我看到它。處理方法中缺少的參數的解決方案是一個很好的做法。 – RadekSohlich

+1

我認爲他需要'required = false'或者他需要重寫框架的默認行爲。簡單的選擇很明確。 –

0

解決方案1:你可以在你的控制器使用自定義@ExceptionHandler,如

@ExceptionHandler(MissingServletRequestParameterException.class) 
public ResponseEntity<?> paramterValidationHandler(HttpServletResquest request){ 
//validate the request here and return an ResponseEntity Object 
} 

解決方案2:將我從來沒有試過自己定製的春季ErrorController但它可以覆蓋它。

解決方案3:您可以爲全局控制器異常處理編寫ControllerAdvice。

相關問題