From 8f0fe713f534efb74d63753f1a2d9477fbc7223e Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 19 Apr 2016 15:30:13 -0400 Subject: [PATCH] Add concrete ResponseStatusException sub-classes --- .../web/server/BadRequestStatusException.java | 63 ++++++++++++++++ .../web/server/MethodNotAllowedException.java | 59 +++++++++++++++ .../server/NotAcceptableStatusException.java | 59 +++++++++++++++ .../UnsupportedMediaTypeStatusException.java | 71 +++++++++++++++++++ 4 files changed, 252 insertions(+) create mode 100644 spring-web-reactive/src/main/java/org/springframework/web/server/BadRequestStatusException.java create mode 100644 spring-web-reactive/src/main/java/org/springframework/web/server/MethodNotAllowedException.java create mode 100644 spring-web-reactive/src/main/java/org/springframework/web/server/NotAcceptableStatusException.java create mode 100644 spring-web-reactive/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java diff --git a/spring-web-reactive/src/main/java/org/springframework/web/server/BadRequestStatusException.java b/spring-web-reactive/src/main/java/org/springframework/web/server/BadRequestStatusException.java new file mode 100644 index 0000000000..5f469b0dd7 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/web/server/BadRequestStatusException.java @@ -0,0 +1,63 @@ +/* + * 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.server; + +import java.util.Optional; + +import org.springframework.core.MethodParameter; +import org.springframework.http.HttpStatus; + +/** + * Exception for errors that fit response status 400 (bad request). + * + * @author Rossen Stoyanchev + */ +public class BadRequestStatusException extends ResponseStatusException { + + private final MethodParameter parameter; + + + /** + * Constructor with an explanation only. + */ + public BadRequestStatusException(String reason) { + this(reason, null); + } + + /** + * Constructor for a 400 error linked to a specific {@code MethodParameter}. + */ + public BadRequestStatusException(String reason, MethodParameter parameter) { + this(reason, parameter, null); + } + + /** + * Constructor for a 400 error with a root cause. + */ + public BadRequestStatusException(String reason, MethodParameter parameter, Throwable cause) { + super(HttpStatus.BAD_REQUEST, reason, cause); + this.parameter = parameter; + } + + + /** + * Return the {@code MethodParameter} associated with this error, if any. + */ + public Optional getMethodParameter() { + return Optional.ofNullable(this.parameter); + } + +} diff --git a/spring-web-reactive/src/main/java/org/springframework/web/server/MethodNotAllowedException.java b/spring-web-reactive/src/main/java/org/springframework/web/server/MethodNotAllowedException.java new file mode 100644 index 0000000000..3759483a64 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/web/server/MethodNotAllowedException.java @@ -0,0 +1,59 @@ +/* + * 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.server; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.springframework.http.HttpStatus; +import org.springframework.util.Assert; + +/** + * Exception for errors that fit response status 405 (method not allowed). + * + * @author Rossen Stoyanchev + */ +public class MethodNotAllowedException extends ResponseStatusException { + + private String method; + + private Set supportedMethods; + + + public MethodNotAllowedException(String method, Collection supportedMethods) { + super(HttpStatus.METHOD_NOT_ALLOWED, "Request method '" + method + "' not supported"); + Assert.notNull(method, "'method' is required"); + this.method = method; + this.supportedMethods = Collections.unmodifiableSet(new HashSet<>(supportedMethods)); + } + + + /** + * Return the HTTP method for the failed request. + */ + public String getHttpMethod() { + return this.method; + } + + /** + * Return the list of supported HTTP methods. + */ + public Set getSupportedMethods() { + return supportedMethods; + } +} diff --git a/spring-web-reactive/src/main/java/org/springframework/web/server/NotAcceptableStatusException.java b/spring-web-reactive/src/main/java/org/springframework/web/server/NotAcceptableStatusException.java new file mode 100644 index 0000000000..fde57105b4 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/web/server/NotAcceptableStatusException.java @@ -0,0 +1,59 @@ +/* + * 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.server; + +import java.util.Collections; +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; + +/** + * Exception for errors that fit response status 405 (not acceptable). + * + * @author Rossen Stoyanchev + */ +public class NotAcceptableStatusException extends ResponseStatusException { + + private final List supportedMediaTypes; + + + /** + * Constructor for when the requested Content-Type is invalid. + */ + public NotAcceptableStatusException(String reason) { + super(HttpStatus.NOT_ACCEPTABLE, reason); + this.supportedMediaTypes = Collections.emptyList(); + } + + /** + * Constructor for when requested Content-Type is not supported. + */ + public NotAcceptableStatusException(List supportedMediaTypes) { + super(HttpStatus.NOT_ACCEPTABLE, "Could not find acceptable representation", null); + this.supportedMediaTypes = Collections.unmodifiableList(supportedMediaTypes); + } + + + /** + * Return the list of supported content types in cases when the Accept + * header is parsed but not supported, or an empty list otherwise. + */ + public List getSupportedMediaTypes() { + return this.supportedMediaTypes; + } + +} diff --git a/spring-web-reactive/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java b/spring-web-reactive/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java new file mode 100644 index 0000000000..0ac7be9def --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/web/server/UnsupportedMediaTypeStatusException.java @@ -0,0 +1,71 @@ +/* + * 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.server; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; + +/** + * Exception for errors that fit response status 416 (unsupported media type). + * + * @author Rossen Stoyanchev + */ +public class UnsupportedMediaTypeStatusException extends ResponseStatusException { + + private final MediaType contentType; + + private final List supportedContentTypes; + + + /** + * Constructor for when the specified Content-Type is invalid. + */ + public UnsupportedMediaTypeStatusException(String reason) { + super(HttpStatus.UNSUPPORTED_MEDIA_TYPE, reason); + this.contentType = null; + this.supportedContentTypes = Collections.emptyList(); + } + + /** + * Constructor for when the Content-Type can be parsed but is not supported. + */ + public UnsupportedMediaTypeStatusException(MediaType contentType, List supportedContentTypes) { + super(HttpStatus.UNSUPPORTED_MEDIA_TYPE, "Content type '" + contentType + "' not supported"); + this.contentType = contentType; + this.supportedContentTypes = Collections.unmodifiableList(supportedContentTypes); + } + + + /** + * Return the request Content-Type header if it was parsed successfully. + */ + public Optional getContentType() { + return Optional.ofNullable(this.contentType); + } + + /** + * Return the list of supported content types in cases when the Content-Type + * header is parsed but not supported, or an empty list otherwise. + */ + public List getSupportedContentTypes() { + return this.supportedContentTypes; + } + +}