【问题标题】:Spring Rest RequestMethod.GET returns 400 Bad Request for @RequestParam required=true when missingSpring Rest RequestMethod.GET 在缺少 @RequestParam required=true 时返回 400 Bad Request
【发布时间】:2015-06-26 03:04:28
【问题描述】:

我是 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 错误请求。也许这是正确的。

但我想要实现的是。当 GET 请求中缺少所需的值时。

我可以发送 JSON 响应,因为缺少 @RequestParamtest

谁能指导我如何做到这一点。

我不确定我错过了什么。

提前致谢。

【问题讨论】:

    标签: java json spring rest spring-mvc


    【解决方案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);
            }
        }
    }
    

    【讨论】:

    • 感谢您的反馈。我知道我可以更改 required = false 并且一切都按照我的意愿进行。但是我希望 required = true CONDITION 存在,并且当使用端点的任何人不发送该值时,一些如何通过发送他忘记发送测试值的响应来验证该请求。我不想让它保持虚假。这不可能吗?
    • 设置required = false有什么问题?该框架旨在在缺少参数时抛出异常。如果你不想要这种行为,那么设置required = false 并实现你自己的逻辑来处理它。
    • 我只是觉得当我使值 required=false 时。我给一个人进入端点。我知道我可以使用 javax 验证并添加一些 @Valid 并通过给出错误消息来处理它,但我不知道我是否可以在 RequestParams 上做到这一点。
    【解决方案2】:

    解决方案 1:您可以在控制器中使用自定义 @ExceptionHandler,例如

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

    解决方案 2:将是自定义 spring ErrorController,我自己从未尝试过,但可以覆盖它。

    解决方案 3:您可以编写一个 ControllerAdvice 用于全局控制器异常处理。

    【讨论】:

      【解决方案3】:

      如果你设置了参数测试是必需的。如果没有该参数,您将无法发送请求。尝试更改参数 required= false 并处理方法中缺少的参数。你可以给我们类似if(test==null) throw new Exception("Param test missing")

      【讨论】:

      • 感谢您的反馈,我知道这一点。我想知道没有办法验证请求并发回错误消息。通过将该值保持为 required= true。通过使其错误并在该方法中处理它对我来说没有意义吗?可能这是不可能的,但我看到很多人都在问同样的事情。
      • 您是否尝试在全球范围内处理此问题。然后尝试搜索spring doc进行异常处理。但在我看来。处理方法中缺少参数的解决方案是很好的做法。
      • 我认为他要么需要required = false,要么需要覆盖框架的默认行为。简单的选择很明确。
      • @all 感谢所有反馈。我想知道这是否可能,但似乎这样的事情还没有实现。 Spring Jira 中有一项改进,使用 javax 验证具有此功能。将来可以帮助我的是链接:jira.spring.io/browse/SPR-6380
      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 2019-10-27
      • 2020-11-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多