From c77dbbb1e6a8de57e17a24490d34c8f5dfd4fc78 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 18 Jul 2018 18:56:51 +0200 Subject: [PATCH] Specific exception for missing request header, cookie, matrix variable Issue: SPR-14818 --- .../bind/MissingMatrixVariableException.java | 70 +++++++++++++++++++ .../bind/MissingPathVariableException.java | 5 +- .../bind/MissingRequestCookieException.java | 70 +++++++++++++++++++ .../bind/MissingRequestHeaderException.java | 70 +++++++++++++++++++ ...ractCookieValueMethodArgumentResolver.java | 4 +- .../RequestHeaderMethodArgumentResolver.java | 4 +- .../MatrixVariableMethodArgumentResolver.java | 4 +- 7 files changed, 219 insertions(+), 8 deletions(-) create mode 100644 spring-web/src/main/java/org/springframework/web/bind/MissingMatrixVariableException.java create mode 100644 spring-web/src/main/java/org/springframework/web/bind/MissingRequestCookieException.java create mode 100644 spring-web/src/main/java/org/springframework/web/bind/MissingRequestHeaderException.java diff --git a/spring-web/src/main/java/org/springframework/web/bind/MissingMatrixVariableException.java b/spring-web/src/main/java/org/springframework/web/bind/MissingMatrixVariableException.java new file mode 100644 index 0000000000..dc2ff82cb8 --- /dev/null +++ b/spring-web/src/main/java/org/springframework/web/bind/MissingMatrixVariableException.java @@ -0,0 +1,70 @@ +/* + * Copyright 2002-2018 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; + +import org.springframework.core.MethodParameter; + +/** + * {@link ServletRequestBindingException} subclass that indicates that a matrix + * variable expected in the method parameters of an {@code @RequestMapping} + * method is not present among the matrix variables extracted from the URL. + * + * @author Juergen Hoeller + * @since 5.1 + * @see MissingPathVariableException + */ +@SuppressWarnings("serial") +public class MissingMatrixVariableException extends ServletRequestBindingException { + + private final String variableName; + + private final MethodParameter parameter; + + + /** + * Constructor for MissingMatrixVariableException. + * @param variableName the name of the missing matrix variable + * @param parameter the method parameter + */ + public MissingMatrixVariableException(String variableName, MethodParameter parameter) { + super(""); + this.variableName = variableName; + this.parameter = parameter; + } + + + @Override + public String getMessage() { + return "Missing matrix variable '" + this.variableName + + "' for method parameter of type " + this.parameter.getNestedParameterType().getSimpleName(); + } + + /** + * Return the expected name of the matrix variable. + */ + public final String getVariableName() { + return this.variableName; + } + + /** + * Return the method parameter bound to the matrix variable. + */ + public final MethodParameter getParameter() { + return this.parameter; + } + +} diff --git a/spring-web/src/main/java/org/springframework/web/bind/MissingPathVariableException.java b/spring-web/src/main/java/org/springframework/web/bind/MissingPathVariableException.java index 8df3229746..e7c430a613 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/MissingPathVariableException.java +++ b/spring-web/src/main/java/org/springframework/web/bind/MissingPathVariableException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2018 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. @@ -27,6 +27,7 @@ import org.springframework.core.MethodParameter; * * @author Rossen Stoyanchev * @since 4.2 + * @see MissingMatrixVariableException */ @SuppressWarnings("serial") public class MissingPathVariableException extends ServletRequestBindingException { @@ -51,7 +52,7 @@ public class MissingPathVariableException extends ServletRequestBindingException @Override public String getMessage() { return "Missing URI template variable '" + this.variableName + - "' for method parameter of type " + this.parameter.getParameterType().getSimpleName(); + "' for method parameter of type " + this.parameter.getNestedParameterType().getSimpleName(); } /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/MissingRequestCookieException.java b/spring-web/src/main/java/org/springframework/web/bind/MissingRequestCookieException.java new file mode 100644 index 0000000000..8c01b871af --- /dev/null +++ b/spring-web/src/main/java/org/springframework/web/bind/MissingRequestCookieException.java @@ -0,0 +1,70 @@ +/* + * Copyright 2002-2018 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; + +import org.springframework.core.MethodParameter; + +/** + * {@link ServletRequestBindingException} subclass that indicates + * that a request cookie expected in the method parameters of an + * {@code @RequestMapping} method is not present. + * + * @author Juergen Hoeller + * @since 5.1 + * @see MissingRequestHeaderException + */ +@SuppressWarnings("serial") +public class MissingRequestCookieException extends ServletRequestBindingException { + + private final String cookieName; + + private final MethodParameter parameter; + + + /** + * Constructor for MissingRequestCookieException. + * @param cookieName the name of the missing request cookie + * @param parameter the method parameter + */ + public MissingRequestCookieException(String cookieName, MethodParameter parameter) { + super(""); + this.cookieName = cookieName; + this.parameter = parameter; + } + + + @Override + public String getMessage() { + return "Missing cookie '" + this.cookieName + + "' for method parameter of type " + this.parameter.getNestedParameterType().getSimpleName(); + } + + /** + * Return the expected name of the request cookie. + */ + public final String getCookieName() { + return this.cookieName; + } + + /** + * Return the method parameter bound to the request cookie. + */ + public final MethodParameter getParameter() { + return this.parameter; + } + +} diff --git a/spring-web/src/main/java/org/springframework/web/bind/MissingRequestHeaderException.java b/spring-web/src/main/java/org/springframework/web/bind/MissingRequestHeaderException.java new file mode 100644 index 0000000000..06c133769c --- /dev/null +++ b/spring-web/src/main/java/org/springframework/web/bind/MissingRequestHeaderException.java @@ -0,0 +1,70 @@ +/* + * Copyright 2002-2018 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; + +import org.springframework.core.MethodParameter; + +/** + * {@link ServletRequestBindingException} subclass that indicates + * that a request header expected in the method parameters of an + * {@code @RequestMapping} method is not present. + * + * @author Juergen Hoeller + * @since 5.1 + * @see MissingRequestCookieException + */ +@SuppressWarnings("serial") +public class MissingRequestHeaderException extends ServletRequestBindingException { + + private final String headerName; + + private final MethodParameter parameter; + + + /** + * Constructor for MissingRequestHeaderException. + * @param headerName the name of the missing request header + * @param parameter the method parameter + */ + public MissingRequestHeaderException(String headerName, MethodParameter parameter) { + super(""); + this.headerName = headerName; + this.parameter = parameter; + } + + + @Override + public String getMessage() { + return "Missing request header '" + this.headerName + + "' for method parameter of type " + this.parameter.getNestedParameterType().getSimpleName(); + } + + /** + * Return the expected name of the request header. + */ + public final String getHeaderName() { + return this.headerName; + } + + /** + * Return the method parameter bound to the request header. + */ + public final MethodParameter getParameter() { + return this.parameter; + } + +} diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java index eb3ae8fc78..677c1be35e 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractCookieValueMethodArgumentResolver.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.web.bind.MissingRequestCookieException; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.CookieValue; @@ -66,8 +67,7 @@ public abstract class AbstractCookieValueMethodArgumentResolver extends Abstract @Override protected void handleMissingValue(String name, MethodParameter parameter) throws ServletRequestBindingException { - throw new ServletRequestBindingException("Missing cookie '" + name + - "' for method parameter of type " + parameter.getNestedParameterType().getSimpleName()); + throw new MissingRequestCookieException(name, parameter); } 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 a8a2cf636e..02563990b0 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 @@ -22,6 +22,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.core.MethodParameter; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.web.bind.MissingRequestHeaderException; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.RequestHeader; @@ -83,8 +84,7 @@ public class RequestHeaderMethodArgumentResolver extends AbstractNamedValueMetho @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()); + throw new MissingRequestHeaderException(name, parameter); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMethodArgumentResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMethodArgumentResolver.java index 839193fa0d..b02d91174a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMethodArgumentResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MatrixVariableMethodArgumentResolver.java @@ -26,6 +26,7 @@ import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; +import org.springframework.web.bind.MissingMatrixVariableException; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.annotation.MatrixVariable; import org.springframework.web.bind.annotation.ValueConstants; @@ -122,8 +123,7 @@ public class MatrixVariableMethodArgumentResolver extends AbstractNamedValueMeth @Override protected void handleMissingValue(String name, MethodParameter parameter) throws ServletRequestBindingException { - throw new ServletRequestBindingException("Missing matrix variable '" + name + - "' for method parameter of type " + parameter.getNestedParameterType().getSimpleName()); + throw new MissingMatrixVariableException(name, parameter); } -- GitLab