3 回答

TA貢獻1995條經驗 獲得超2個贊
您可以為任何情況聲明自己的異常,并在控制器中設置 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(); }

TA貢獻1842條經驗 獲得超21個贊
RequestHeaderMethodArgumentResolver如果您看到which is used for的實現,您將看到抽象類方法@RequestHeader的重寫實現,如下所示: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根據某些條件進行擴展。因此,當標頭不存在并ServletRequestBindingException拋出時,SpringDefaultHandlerExceptionResolver將處理該問題并發送400響應。
這就是驗證在@RequestHeader. resolveArgument所以你可以在你的類的方法中實現類似的東西,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貢獻1790條經驗 獲得超9個贊
我明白了擴展哪個類是讓 Spring 發揮魔力的正確類。
RequestHeaderMethodArgumentResolverSpring 用來解析 Java 對象中的 HTTP 標頭值的類擴展了抽象類AbstractNamedValueMethodArgumentResolver。此類允許您使用createNamedValueInfo方法指定標頭值是否具有某些默認值。
所以,它遵循代碼。
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()));
}
}
我唯一不喜歡的是我正在使用為處理命名值而開發的結構,但我沒有命名值。
希望能幫助到你。
添加回答
舉報