java - 在 Spring 中使用自定义解析器返回 HTTP 状态 BAD_REQUEST
问题描述
我正在使用Spring Boot 1.5.15开发一个 REST API 。我已经实现了一个客户HandlerMethodArgumentResolver
来映射一个 HTTP 标头。具体来说,我分配了 HTTP 标头的值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());
}
}
现在,我可以在我需要的任何控制器中使用以下映射。
@PostMapping("/some/paath")
public void someMethod(@SomeHeader String someHeaderValue) {
// Method body...
}
但是,Some-Header
信息对我来说是强制性的。我希望如果它不存在,Spring 会向调用者返回 400 Bad Request 响应。这与我可以使用@RequestHeader("Some-Header")
注释获得的行为相同。
我可以复制相同的行为吗?可能,我不想使用专门的控制器建议。
解决方案
您可以为任何情况声明自己的异常,并在控制器中设置 ExceptionHandler 以返回正确的 http-status。
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({SameHeaderException.class})
public Object onSameHeaderException(SameHeaderException e) {
return ImmutableMap.of("reason", e.getMessage());
}
因此,如果没有标头,您可以抛出此异常:
if (someHeaderValue == null) { throw new SameHeaderException(); }
推荐阅读
- c++ - 需要帮助进行回文测试
- html - 尝试在 Django 中的表单上使用脆表单过滤器时收到“无效表单:脆”错误,但仅在一个 django 应用程序中而不是另一个?
- python-3.x - PyCapsule,但用于原始内存位置
- php - 如果数据库中不存在用户的电子邮件,则提醒并阻止数据保存到数据库中
- c - 手动添加位掩码与添加按位移位
- awk - 在 awk 不正确的情况下将十六进制转换为十进制(使用 --non-decimal-data 或 strtonum)
- r - R函数解析strsplit“下标越界”中的返回错误
- cordova - 如何调试在 Windows 10 上作为 UWP 运行的空白白屏 Ionic 4
- android - 如何仅为当前片段设置toolbar.setNavigationOnClickListener?
- sql - 在 SQL 查询中每 5 行更改一次列