gpt4 book ai didi

spring-restcontroller - Spring restController : how to error when unknown @RequestParam is in url

转载 作者:行者123 更新时间:2023-12-04 15:32:43 24 4
gpt4 key购买 nike

我正在使用 spring 4.2 创建一些restfull web 服务。
但我们意识到,当用户输入错误的非强制性 @RequestParam 之一时,我们没有得到他传递的参数未知的错误。

就像我们有 @RequestParam(required=false, value="valueA")字符串值 A 和他在调用中使用 '?valueA=AA' -> 我们想要一个错误。
但我似乎没有找到一种方法来做到这一点,该值只是被忽略而用户不知道这一点。

最佳答案

一种可能的解决方案是创建 HandlerInterceptor 的实现。这将验证传递给处理程序方法的所有请求参数是否在其 @RequestParam 中声明。带注释的参数。

但是,您应该考虑这种解决方案的缺点。在某些情况下,您可能希望允许传入某些参数而不将其声明为请求参数。例如,如果您有类似 GET /foo?page=1&offset=0 的请求并具有以下签名的处理程序:

@RequestMapping
public List<Foo> listFoos(PagingParams page);

PagingParams是一个包含 page 的类和 offset属性,它通常会从请求参数映射。您想要的解决方案的实现会干扰这个 Spring MVC 的功能。

话虽如此,这是我想到的一个示例实现:

public class UndeclaredParamsHandlerInterceptor extends HandlerInterceptorAdapter {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
checkParams(request, getDeclaredRequestParams(handlerMethod));
}
return true;
}

private void checkParams(HttpServletRequest request, Set<String> allowedParams) {
request.getParameterMap().entrySet().forEach(entry -> {
String param = entry.getKey();
if (!allowedParams.contains(param)) {
throw new UndeclaredRequestParamException(param, allowedParams);
}
});
}

private Set<String> getDeclaredRequestParams(HandlerMethod handlerMethod) {
Set<String> declaredRequestParams = new HashSet<>();
MethodParameter[] methodParameters = handlerMethod.getMethodParameters();
ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();

for (MethodParameter methodParameter : methodParameters) {
if (methodParameter.hasParameterAnnotation(RequestParam.class)) {
RequestParam requestParam = methodParameter.getParameterAnnotation(RequestParam.class);
if (StringUtils.hasText(requestParam.value())) {
declaredRequestParams.add(requestParam.value());
} else {
methodParameter.initParameterNameDiscovery(parameterNameDiscoverer);
declaredRequestParams.add(methodParameter.getParameterName());
}
}
}
return declaredRequestParams;
}

}

基本上这将完成我上面描述的操作。然后,您可以为它抛出的异常添加异常处理程序并将其转换为 HTTP 400 响应。我在 Github 上放了更多完整的样本,其中包括一种通过注释有选择地为各个处理程序方法启用此行为的方法。

关于spring-restcontroller - Spring restController : how to error when unknown @RequestParam is in url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com