3 回答

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
您可以為任何情況聲明自己的異常,并在控制器中設(shè)置 ExceptionHandler 以返回正確的 http-status。
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({SameHeaderException.class})
public Object onSameHeaderException(SameHeaderException e) {
return ImmutableMap.of("reason", e.getMessage());
}
因此,如果標(biāo)頭不存在,您可以拋出此異常:
if (someHeaderValue == null) { throw new SameHeaderException(); }

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
RequestHeaderMethodArgumentResolver如果您看到which is used for的實(shí)現(xiàn),您將看到抽象類方法@RequestHeader的重寫實(shí)現(xiàn),如下所示:handleMissingValueAbstractNamedValueMethodArgumentResolver
@Override
protected void handleMissingValue(String name, MethodParameter parameter) throws ServletRequestBindingException {
throw new ServletRequestBindingException("Missing request header '" + name +
"' for method parameter of type " + parameter.getNestedParameterType().getSimpleName());
}
該handleMissingValue方法用于resolveArgument的方法中AbstractNamedValueMethodArgumentResolver,它RequestHeaderMethodArgumentResolver根據(jù)某些條件進(jìn)行擴(kuò)展。因此,當(dāng)標(biāo)頭不存在并ServletRequestBindingException拋出時(shí),SpringDefaultHandlerExceptionResolver將處理該問題并發(fā)送400響應(yīng)。
這就是驗(yàn)證在@RequestHeader. resolveArgument所以你可以在你的類的方法中實(shí)現(xiàn)類似的東西,SomeHeaderArgumentResolver如下所示:
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");
if(headerValue != null){
return headerValue.replace("XXX ", "");
} else {
//handle scenario if header absent with ServletRequestBindingException
}
}
}

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
我明白了擴(kuò)展哪個(gè)類是讓 Spring 發(fā)揮魔力的正確類。
RequestHeaderMethodArgumentResolverSpring 用來解析 Java 對(duì)象中的 HTTP 標(biāo)頭值的類擴(kuò)展了抽象類AbstractNamedValueMethodArgumentResolver。此類允許您使用createNamedValueInfo方法指定標(biāo)頭值是否具有某些默認(rèn)值。
所以,它遵循代碼。
public class SomeHeaderArgumentResolver extends AbstractNamedValueMethodArgumentResolver {
@Override
protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
// The second parameter specifies if the value is required,
// and the third if there is some default value.
return new NamedValueInfo("", true, null);
}
@Override
protected Object resolveName(String name,
MethodParameter parameter,
NativeWebRequest request) {
final String headerValue = request.getHeader("Some-Value");
if (StringUtils.isEmpty(headerValue)) {
// Returning null tells Spring that there is no value for the parameter
return null;
}
return headerValue.replace("XXX ", "");
}
@Override
public boolean supportsParameter(MethodParameter parameter) {
return (parameter.hasParameterAnnotation(SomeHeader.class) &&
!Map.class.isAssignableFrom(
parameter.nestedIfOptional().getNestedParameterType()));
}
}
我唯一不喜歡的是我正在使用為處理命名值而開發(fā)的結(jié)構(gòu),但我沒有命名值。
希望能幫助到你。
添加回答
舉報(bào)