当前位置: 首页 > 知识库问答 >
问题:

Spring GET方法如何在控制器中引发未知请求参数的异常

周墨一
2023-03-14

因此,我的控制器中有一个GET方法,带有可选的请求参数:

@GetMapping(path = "/users/search")
    public @ResponseBody ResponseEntity<List<User>> getUserLike(
      @RequestParam(name = "id", required = false) Long id,
      @RequestParam(name = "name", required = false) String name,
      @RequestParam(name = "dateofbirth", required = false) @DateTimeFormat(pattern = "dd-MM-yyyy") LocalDate dateOfBirth
    ) {
      return userService.getUserLike(id, name, dateOfBirth);
    }

当我试图用未知参数调用此请求时

/users/search?id=1&myunknownparam=unknownParam

我想在请求有未知参数时引发一个异常,比如这里的myunknownparam。

虽然目前我的所有参数都是可选的,但我的服务返回的结果与所有参数设置为null时相同。

共有1个答案

东门子昂
2023-03-14

查询参数通常是可选的,因此服务器很少会因此拒绝您。
但是您试图实现的可以通过Interceptor实现,您需要一些反射来获取方法的参数并验证每个客户端参数在方法的签名上定义。

比如:

@Component
public class QueryParamInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) {
        Map<String, String[]> clientRequestParameters = request.getParameterMap();
        MethodParameter[] methodParameters = ((HandlerMethod) handler).getMethodParameters();
        List<String> definedMethodsParameters = Arrays.stream(methodParameters)
                .flatMap(methodParameter -> Arrays.stream(methodParameter.getParameterAnnotations()))
                .filter(annotation -> annotation.annotationType().isAssignableFrom(RequestParam.class))
                .map(annotation -> ((RequestParam) annotation).name())
                .collect(Collectors.toList());

        for (String clientRequestParameterKey : clientRequestParameters.keySet()) {
            if (!definedMethodsParameters.contains(clientRequestParameterKey)) {
                throw new IllegalArgumentException("The parameter " + clientRequestParameterKey + " passed by the client is unknown");
            }
        }
        return true;
    }
}

请注意,每次请求都会调用一个拦截器。所以我不会在生产中使用它,因为对象内省的成本很高。。

 类似资料:
  • 问题内容: 在此期间,我正在研究Spring MVC展示示例(可从STS dasboard下载),并对示例有一些简单的问题: 1)在我的页面中,我具有以下链接: 通过此链接可以看到,我正在执行一个HTTP GET请求,该请求的“ foo”参数包含值:“ bar”。 此HTTP请求由控制器类MappingController的以下方法处理: 此方法管理具有名为“ foo”的参数的HTTP请求(仅类型

  • 在这段时间里,我将介绍Spring MVC showcase示例(可从STS dasboard下载),并且我有一些关于示例的简单问题: 1)在我的页面中,我有以下链接: 如何获取此参数的值(“bar”)并将其放在我的by parameter方法代码内的变量中?

  • 在我的控制器中,我有一个用以下映射映射的方法:@PostMapping(“/”)。 此方法需要一个我试图捕获的请求主体,如下所述: 使用这两种方法对我来说都很好,我只是进退两难,如果直接在实体类中接受请求体是一个好主意和最佳实践的话。 我不想在controller类中公开我的实体类,因为我不确定这是否是一个好主意。 java 这两种方法都给出了相同的结果,更多的是关注要遵循的最佳实践。

  • 我正在使用Java和Spring构建一个RESTAPI,我需要在我的控制器中处理一个POST请求,但我需要从该请求中提取主体,它是一个JSON,也是该请求的“来源”, 我有几个问题:首先是如何获取该请求的来源(我猜是在标题中移动的url?),是否有与@RequestBody类似的注释?。 我的第二个问题是,在这种post方法中,通常应该返回什么对象作为响应。

  • 请帮我弄明白这一点? 提前致谢

  • 问题内容: 我有一个Sinatra应用程序,并且在我的大多数控制器中,json都会传入并在params对象中自动获取。但是,除非我用before方法来拉取request.body参数,否则我将获得一个根本不获取参数的后期操作.body参数将它们解析为JSON并将它们合并到params哈希中。 这是控制器以及filter方法: 我看到的输出基本上是,控制器操作中的参数实际上正确地位于其中。但是,如果