Spring Rest RequestMethod.GET在丢失时返回400错误请求@RequestParam required = true

时间:2015-06-26 03:04:29

标签: java json spring rest spring-mvc

我是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测试

任何人都可以指导我如何实现这一目标。

我不确定我错过了什么。

提前致谢。

3 个答案:

答案 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。