From c780a39fe096ac6608b507998805212aeb4319d3 Mon Sep 17 00:00:00 2001 From: asong Date: Sun, 23 Oct 2016 17:02:27 -0700 Subject: [PATCH] Add exception MissingServletRequestHeaderException Add a new exception, MissingServletRequestHeaderException, in the event of a missing required request header. This exception is more consistent with how missing reqest parameters are handled. Issue: SPR-14818 --- .../MissingServletRequestHeaderException.java | 65 +++++++++++++++++++ .../RequestHeaderMethodArgumentResolver.java | 6 +- ...uestHeaderMethodArgumentResolverTests.java | 3 +- 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 spring-web/src/main/java/org/springframework/web/bind/MissingServletRequestHeaderException.java diff --git a/spring-web/src/main/java/org/springframework/web/bind/MissingServletRequestHeaderException.java b/spring-web/src/main/java/org/springframework/web/bind/MissingServletRequestHeaderException.java new file mode 100644 index 000000000000..12dfe5c999e1 --- /dev/null +++ b/spring-web/src/main/java/org/springframework/web/bind/MissingServletRequestHeaderException.java @@ -0,0 +1,65 @@ +/* + * Copyright 2002-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.web.bind; + +/** + * {@link ServletRequestBindingException} subclass that indicates a missing header. + * + * @author Austin Song + * @since 4.3.3 + */ +@SuppressWarnings("serial") +public class MissingServletRequestHeaderException extends ServletRequestBindingException { + + private final String headerName; + + private final String headerType; + + + /** + * Constructor for MissingServletRequestHeaderException. + * @param headerName the name of the missing header + * @param headerType the expected type of the missing header + */ + public MissingServletRequestHeaderException(String headerName, String headerType) { + super(""); + this.headerName = headerName; + this.headerType = headerType; + } + + + @Override + public String getMessage() { + return "Required " + this.headerType+ " header '" + this.headerName+ "' " + + "is not present"; + } + + /** + * Return the name of the offending header. + */ + public final String getHeaderName() { + return this.headerName; + } + + /** + * Return the expected type of the offending header. + */ + public final String getHeaderType() { + return this.headerType; + } + +} diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java index c8575251cea7..12ef0b8f9278 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolver.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; +import org.springframework.web.bind.MissingServletRequestHeaderException; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.RequestHeader; @@ -77,9 +78,8 @@ protected Object resolveName(String name, MethodParameter parameter, NativeWebRe } @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()); + protected void handleMissingValue(String name, MethodParameter parameter) throws MissingServletRequestHeaderException{ + throw new MissingServletRequestHeaderException(name, parameter.getNestedParameterType().getTypeName()); } diff --git a/spring-web/src/test/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolverTests.java b/spring-web/src/test/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolverTests.java index a453abb0deec..471a83406d9f 100644 --- a/spring-web/src/test/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolverTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolverTests.java @@ -32,6 +32,7 @@ import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletResponse; import org.springframework.util.ReflectionUtils; +import org.springframework.web.bind.MissingServletRequestHeaderException; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; @@ -187,7 +188,7 @@ public void resolveDefaultValueFromRequest() throws Exception { assertEquals("/bar", result); } - @Test(expected = ServletRequestBindingException.class) + @Test(expected = MissingServletRequestHeaderException.class) public void notFound() throws Exception { resolver.resolveArgument(paramNamedValueStringArray, null, webRequest, null); }