我是Spring和Rest Endpoints的新手。
我有一个控制器,它接受@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);
}
}
当我发送带有请求参数的get时,它会命中端点,这就是我所期望的。
示例:path / search / again.do?test = yes
一切都很完美。
这是我遇到问题的地方:
当我发送缺少该值的Get时:
示例:path / search / again.do
我收到400 Bad Request。可能这是正确的。
但我想要达到的目标是什么。当GET请求中缺少所需的值时。
我可以发送JSON响应,因为缺少@RequestParam
值测试。
任何人都可以指导我如何实现这一目标。
我不确定我错过了什么。
提前致谢。
答案 0 :(得分:2)
如果仔细查看代码,您会发现答案正在盯着您。只需将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);
}
}
}
答案 1 :(得分:0)
如果设置参数test,则需要。如果没有那个参数,你就无法发送请求。尝试更改param required = false并处理方法中缺少的参数。您可以使用类似if(test==null) throw new Exception("Param test missing")
答案 2 :(得分:0)
解决方案1:您可以在控制器中使用自定义@ExceptionHandler,例如
@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseEntity<?> paramterValidationHandler(HttpServletResquest request){
//validate the request here and return an ResponseEntity Object
}
解决方案2:自定义弹簧ErrorController,我从未尝试过,但可以覆盖它。
解决方案3:您可以为全局控制器异常处理编写一个ControllerAdvice。