gpt4 book ai didi

java - 在 Spring 中使用自定义解析器返回 HTTP 状态 BAD_REQUEST

转载 作者:行者123 更新时间:2023-11-30 01:48:33 25 4
gpt4 key购买 nike

我正在使用 Spring Boot 1.5.15 开发 REST API。我已经实现了一个客户 HandlerMethodArgumentResolver 来映射 HTTP header 。具体来说,我分配了 HTTP header Some-Header 的值,删除了前缀“XXX”。

首先,我定义了一个自定义注释。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface SomeHeader {
}

然后,我实现了一个自定义解析器。

public class SomeHeaderArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(SomeHeader.class) != null;
}

@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
final String headerValue = request.getHeader("Some-Header");

return headerValue.replace("XXX ", "");
}
}

最后,我让 Spring 了解配置类中的解析器。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new SomeHeaderArgumentResolver());
}
}

现在,我可以在我需要的任何 Controller 中使用以下映射。

@PostMapping("/some/paath")
public void someMethod(@SomeHeader String someHeaderValue) {
// Method body...
}

但是,Some-Header 信息对我来说是强制性的。我希望如果它不存在,Spring 会向调用者返回 400 Bad Request 响应。这与我使用 @RequestHeader("Some-Header") 注释获得的行为相同。

我可以复制相同的行为吗?可能,我不想使用专用的 Controller 建议

最佳答案

您可以在任何情况下声明自己的异常,并在 Controller 中设置 ExceptionHandler 以返回正确的 http 状态。

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({SameHeaderException.class})
public Object onSameHeaderException(SameHeaderException e) {
return ImmutableMap.of("reason", e.getMessage());
}

因此,如果 header 不存在,您可以抛出此异常:

if (someHeaderValue == null) { throw new SameHeaderException(); }

关于java - 在 Spring 中使用自定义解析器返回 HTTP 状态 BAD_REQUEST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904532/

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