我正在使用Spring Boot 1.5.15开发 REST API 。我已经实施了一个客户HandlerMethodArgumentResolver来映射 HTTP 标头。具体来说,我分配了 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());
}
}
现在,我可以在我需要的任何控制器中使用以下映射。
@PostMapping("/some/paath")
public void someMethod(@SomeHeader String someHeaderValue) {
// Method body...
}
但是,Some-Header信息对我来说是强制性的。我希望如果它不存在,Spring 会向调用者返回 400 Bad Request 响应。这与我使用注释可以获得的行为相同@RequestHeader("Some-Header")。
我可以复制相同的行为吗?可能,我不想使用专用的控制器建议。
拉风的咖菲猫
茅侃侃
富国沪深
相关分类