Introduce alias for 'value' attribute in @ResponseStatus
Issue: SPR-11393
This commit is contained in:
parent
c55486d5d5
commit
6a5b2672e7
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2012 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.test.web.servlet.samples.standalone.resultmatchers;
|
package org.springframework.test.web.servlet.samples.standalone.resultmatchers;
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
@ -38,12 +37,7 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
|
||||||
*/
|
*/
|
||||||
public class StatusAssertionTests {
|
public class StatusAssertionTests {
|
||||||
|
|
||||||
private MockMvc mockMvc;
|
private final MockMvc mockMvc = standaloneSetup(new StatusController()).build();
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setup() {
|
|
||||||
this.mockMvc = standaloneSetup(new StatusController()).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStatusInt() throws Exception {
|
public void testStatusInt() throws Exception {
|
||||||
|
@ -86,7 +80,7 @@ public class StatusAssertionTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/badRequest")
|
@RequestMapping("/badRequest")
|
||||||
@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Expired token")
|
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "Expired token")
|
||||||
public @ResponseBody void badRequest(){
|
public @ResponseBody void badRequest(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2012 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -22,13 +22,18 @@ import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import org.springframework.core.annotation.AliasFor;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Marks a method or exception class with the status code and reason that should be returned. The status code is applied
|
* Marks a method or exception class with the status {@link #code} and
|
||||||
* to the HTTP response when the handler method is invoked, or whenever said exception is thrown.
|
* {@link #reason} that should be returned.
|
||||||
|
*
|
||||||
|
* <p>The status code is applied to the HTTP response when the handler
|
||||||
|
* method is invoked, or whenever said exception is thrown.
|
||||||
*
|
*
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
|
* @author Sam Brannen
|
||||||
* @see org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver
|
* @see org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver
|
||||||
* @since 3.0
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
|
@ -38,16 +43,27 @@ import org.springframework.http.HttpStatus;
|
||||||
public @interface ResponseStatus {
|
public @interface ResponseStatus {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The status code to use for the response.
|
* Alias for {@link #code}.
|
||||||
*
|
|
||||||
* @see javax.servlet.http.HttpServletResponse#setStatus(int)
|
|
||||||
*/
|
*/
|
||||||
HttpStatus value();
|
@AliasFor(attribute = "code")
|
||||||
|
HttpStatus value() default HttpStatus.INTERNAL_SERVER_ERROR;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The reason to be used for the response. <p>If this element is not set, it will default to the standard status
|
* The status <em>code</em> to use for the response.
|
||||||
* message for the status code. Note that due to the use of {@code HttpServletResponse.sendError(int, String)},
|
* <p>Default is {@link HttpStatus#INTERNAL_SERVER_ERROR}, which should
|
||||||
* the response will be considered complete and should not be written to any further.
|
* typically be changed to something more appropriate.
|
||||||
|
* @since 4.2
|
||||||
|
* @see javax.servlet.http.HttpServletResponse#setStatus(int)
|
||||||
|
*/
|
||||||
|
@AliasFor(attribute = "value")
|
||||||
|
HttpStatus code() default HttpStatus.INTERNAL_SERVER_ERROR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The <em>reason</em> to be used for the response.
|
||||||
|
* <p>If this attribute is not set, it will default to the standard status
|
||||||
|
* message for the status code. Note that due to the use of
|
||||||
|
* {@code HttpServletResponse.sendError(int, String)}, the response will be
|
||||||
|
* considered complete and should not be written to any further.
|
||||||
*
|
*
|
||||||
* @see javax.servlet.http.HttpServletResponse#sendError(int, String)
|
* @see javax.servlet.http.HttpServletResponse#sendError(int, String)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -917,7 +917,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
|
||||||
|
|
||||||
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class);
|
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class);
|
||||||
if (responseStatusAnn != null) {
|
if (responseStatusAnn != null) {
|
||||||
HttpStatus responseStatus = responseStatusAnn.value();
|
HttpStatus responseStatus = responseStatusAnn.code();
|
||||||
String reason = responseStatusAnn.reason();
|
String reason = responseStatusAnn.reason();
|
||||||
if (!StringUtils.hasText(reason)) {
|
if (!StringUtils.hasText(reason)) {
|
||||||
webRequest.getResponse().setStatus(responseStatus.value());
|
webRequest.getResponse().setStatus(responseStatus.value());
|
||||||
|
|
|
@ -379,7 +379,7 @@ public class AnnotationMethodHandlerExceptionResolver extends AbstractHandlerExc
|
||||||
|
|
||||||
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class);
|
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class);
|
||||||
if (responseStatusAnn != null) {
|
if (responseStatusAnn != null) {
|
||||||
HttpStatus responseStatus = responseStatusAnn.value();
|
HttpStatus responseStatus = responseStatusAnn.code();
|
||||||
String reason = responseStatusAnn.reason();
|
String reason = responseStatusAnn.reason();
|
||||||
if (!StringUtils.hasText(reason)) {
|
if (!StringUtils.hasText(reason)) {
|
||||||
webRequest.getResponse().setStatus(responseStatus.value());
|
webRequest.getResponse().setStatus(responseStatus.value());
|
||||||
|
|
|
@ -95,7 +95,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes
|
||||||
protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request,
|
protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request,
|
||||||
HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||||
|
|
||||||
int statusCode = responseStatus.value().value();
|
int statusCode = responseStatus.code().value();
|
||||||
String reason = responseStatus.reason();
|
String reason = responseStatus.reason();
|
||||||
if (this.messageSource != null) {
|
if (this.messageSource != null) {
|
||||||
reason = this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale());
|
reason = this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale());
|
||||||
|
|
|
@ -84,7 +84,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
|
||||||
private void initResponseStatus() {
|
private void initResponseStatus() {
|
||||||
ResponseStatus annotation = getMethodAnnotation(ResponseStatus.class);
|
ResponseStatus annotation = getMethodAnnotation(ResponseStatus.class);
|
||||||
if (annotation != null) {
|
if (annotation != null) {
|
||||||
this.responseStatus = annotation.value();
|
this.responseStatus = annotation.code();
|
||||||
this.responseReason = annotation.reason();
|
this.responseReason = annotation.reason();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,7 +372,7 @@ public class WebMvcConfigurationSupportTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "exception.user.exists")
|
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "exception.user.exists")
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
public static class UserAlreadyExistsException extends RuntimeException {
|
public static class UserAlreadyExistsException extends RuntimeException {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2012 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -166,7 +166,7 @@ public class AnnotationMethodHandlerExceptionResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExceptionHandler(SocketException.class)
|
@ExceptionHandler(SocketException.class)
|
||||||
@ResponseStatus(value = HttpStatus.NOT_ACCEPTABLE, reason = "This is simply unacceptable!")
|
@ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE, reason = "This is simply unacceptable!")
|
||||||
public String handleSocketException(Exception ex, HttpServletResponse response) {
|
public String handleSocketException(Exception ex, HttpServletResponse response) {
|
||||||
return "Y:" + ClassUtils.getShortName(ex.getClass());
|
return "Y:" + ClassUtils.getShortName(ex.getClass());
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,19 +110,16 @@ public class ResponseStatusExceptionResolverTests {
|
||||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private static class StatusCodeException extends Exception {
|
private static class StatusCodeException extends Exception {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseStatus(value = HttpStatus.GONE, reason = "You suck!")
|
@ResponseStatus(code = HttpStatus.GONE, reason = "You suck!")
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private static class StatusCodeAndReasonException extends Exception {
|
private static class StatusCodeAndReasonException extends Exception {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseStatus(value = HttpStatus.GONE, reason = "gone.reason")
|
@ResponseStatus(code = HttpStatus.GONE, reason = "gone.reason")
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
private static class StatusCodeAndReasonMessageException extends Exception {
|
private static class StatusCodeAndReasonMessageException extends Exception {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2014 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -2992,7 +2992,7 @@ public class ServletAnnotationControllerTests {
|
||||||
public static class ResponseStatusController {
|
public static class ResponseStatusController {
|
||||||
|
|
||||||
@RequestMapping("/something")
|
@RequestMapping("/something")
|
||||||
@ResponseStatus(value = HttpStatus.CREATED, reason = "It's alive!")
|
@ResponseStatus(code = HttpStatus.CREATED, reason = "It's alive!")
|
||||||
public void handle(Writer writer) throws IOException {
|
public void handle(Writer writer) throws IOException {
|
||||||
writer.write("something");
|
writer.write("something");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2013 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -353,14 +353,14 @@ public class RequestMappingHandlerAdapterIntegrationTests {
|
||||||
return "viewName";
|
return "viewName";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseStatus(value=HttpStatus.ACCEPTED)
|
@ResponseStatus(HttpStatus.ACCEPTED)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String handleRequestBody(@RequestBody byte[] bytes) throws Exception {
|
public String handleRequestBody(@RequestBody byte[] bytes) throws Exception {
|
||||||
String requestBody = new String(bytes, "UTF-8");
|
String requestBody = new String(bytes, "UTF-8");
|
||||||
return "Handled requestBody=[" + requestBody + "]";
|
return "Handled requestBody=[" + requestBody + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseStatus(value=HttpStatus.ACCEPTED)
|
@ResponseStatus(code = HttpStatus.ACCEPTED)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String handleAndValidateRequestBody(@Valid TestBean modelAttr, Errors errors) throws Exception {
|
public String handleAndValidateRequestBody(@Valid TestBean modelAttr, Errors errors) throws Exception {
|
||||||
return "Error count [" + errors.getErrorCount() + "]";
|
return "Error count [" + errors.getErrorCount() + "]";
|
||||||
|
|
|
@ -2657,7 +2657,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
|
||||||
public static class ResponseStatusController {
|
public static class ResponseStatusController {
|
||||||
|
|
||||||
@RequestMapping("/something")
|
@RequestMapping("/something")
|
||||||
@ResponseStatus(value = HttpStatus.CREATED, reason = "It's alive!")
|
@ResponseStatus(code = HttpStatus.CREATED, reason = "It's alive!")
|
||||||
public void handle(Writer writer) throws IOException {
|
public void handle(Writer writer) throws IOException {
|
||||||
writer.write("something");
|
writer.write("something");
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.web.servlet.mvc.method.annotation;
|
package org.springframework.web.servlet.mvc.method.annotation;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
|
||||||
import static org.mockito.Mockito.*;
|
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -26,7 +23,6 @@ import java.util.List;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
|
@ -50,37 +46,30 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandlerCom
|
||||||
import org.springframework.web.method.support.ModelAndViewContainer;
|
import org.springframework.web.method.support.ModelAndViewContainer;
|
||||||
import org.springframework.web.servlet.view.RedirectView;
|
import org.springframework.web.servlet.view.RedirectView;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test fixture with {@link ServletInvocableHandlerMethod}.
|
* Test fixture with {@link ServletInvocableHandlerMethod}.
|
||||||
*
|
*
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
|
* @author Sam Brannen
|
||||||
*/
|
*/
|
||||||
public class ServletInvocableHandlerMethodTests {
|
public class ServletInvocableHandlerMethodTests {
|
||||||
|
|
||||||
private HandlerMethodArgumentResolverComposite argumentResolvers;
|
private final HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite();
|
||||||
|
|
||||||
private HandlerMethodReturnValueHandlerComposite returnValueHandlers;
|
private final HandlerMethodReturnValueHandlerComposite returnValueHandlers = new HandlerMethodReturnValueHandlerComposite();
|
||||||
|
|
||||||
private ModelAndViewContainer mavContainer;
|
private final ModelAndViewContainer mavContainer = new ModelAndViewContainer();
|
||||||
|
|
||||||
private ServletWebRequest webRequest;
|
private final MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
|
|
||||||
private MockHttpServletRequest request;
|
private final MockHttpServletResponse response = new MockHttpServletResponse();
|
||||||
|
|
||||||
private MockHttpServletResponse response;
|
private final ServletWebRequest webRequest = new ServletWebRequest(this.request, this.response);
|
||||||
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite();
|
|
||||||
this.argumentResolvers = new HandlerMethodArgumentResolverComposite();
|
|
||||||
this.mavContainer = new ModelAndViewContainer();
|
|
||||||
this.request = new MockHttpServletRequest();
|
|
||||||
this.response = new MockHttpServletResponse();
|
|
||||||
this.webRequest = new ServletWebRequest(this.request, this.response);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void invokeAndHandle_VoidWithResponseStatus() throws Exception {
|
public void invokeAndHandle_VoidWithResponseStatus() throws Exception {
|
||||||
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "responseStatus");
|
ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "responseStatus");
|
||||||
|
@ -279,11 +268,11 @@ public class ServletInvocableHandlerMethodTests {
|
||||||
return "view";
|
return "view";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
public void responseStatus() {
|
public void responseStatus() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "400 Bad Request")
|
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "400 Bad Request")
|
||||||
public String responseStatusWithReason() {
|
public String responseStatusWithReason() {
|
||||||
return "foo";
|
return "foo";
|
||||||
}
|
}
|
||||||
|
@ -299,7 +288,6 @@ public class ServletInvocableHandlerMethodTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
private static class MethodLevelResponseBodyHandler {
|
private static class MethodLevelResponseBodyHandler {
|
||||||
|
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
|
@ -324,12 +312,11 @@ public class ServletInvocableHandlerMethodTests {
|
||||||
return new DeferredResult<>();
|
return new DeferredResult<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResponseEntity handleRawType() {
|
public ResponseEntity<Void> handleRawType() {
|
||||||
return ResponseEntity.ok().build();
|
return ResponseEntity.ok().build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
private static class ExceptionRaisingReturnValueHandler implements HandlerMethodReturnValueHandler {
|
private static class ExceptionRaisingReturnValueHandler implements HandlerMethodReturnValueHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue