diff --git a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/StatusAssertionTests.java b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/StatusAssertionTests.java index c4de14aa28..d092d723b3 100644 --- a/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/StatusAssertionTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/resultmatchers/StatusAssertionTests.java @@ -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"); * 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; -import org.junit.Before; import org.junit.Test; import org.springframework.http.HttpStatus; @@ -38,12 +37,7 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; */ public class StatusAssertionTests { - private MockMvc mockMvc; - - @Before - public void setup() { - this.mockMvc = standaloneSetup(new StatusController()).build(); - } + private final MockMvc mockMvc = standaloneSetup(new StatusController()).build(); @Test public void testStatusInt() throws Exception { @@ -86,7 +80,7 @@ public class StatusAssertionTests { } @RequestMapping("/badRequest") - @ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Expired token") + @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "Expired token") public @ResponseBody void badRequest(){ } diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java index e4df7821c1..17869f8304 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java @@ -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"); * 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.Target; +import org.springframework.core.annotation.AliasFor; 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 - * to the HTTP response when the handler method is invoked, or whenever said exception is thrown. + * Marks a method or exception class with the status {@link #code} and + * {@link #reason} that should be returned. + * + *

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 Sam Brannen * @see org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver * @since 3.0 */ @@ -38,16 +43,27 @@ import org.springframework.http.HttpStatus; public @interface ResponseStatus { /** - * The status code to use for the response. - * - * @see javax.servlet.http.HttpServletResponse#setStatus(int) + * Alias for {@link #code}. */ - HttpStatus value(); + @AliasFor(attribute = "code") + HttpStatus value() default HttpStatus.INTERNAL_SERVER_ERROR; /** - * The reason to be used for the response.

If this element 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. + * The status code to use for the response. + *

Default is {@link HttpStatus#INTERNAL_SERVER_ERROR}, which should + * 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 reason to be used for the response. + *

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) */ diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index 49be5840b6..62f96c0aac 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -917,7 +917,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class); if (responseStatusAnn != null) { - HttpStatus responseStatus = responseStatusAnn.value(); + HttpStatus responseStatus = responseStatusAnn.code(); String reason = responseStatusAnn.reason(); if (!StringUtils.hasText(reason)) { webRequest.getResponse().setStatus(responseStatus.value()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java index 3e8a37318f..8c82389246 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java @@ -379,7 +379,7 @@ public class AnnotationMethodHandlerExceptionResolver extends AbstractHandlerExc ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class); if (responseStatusAnn != null) { - HttpStatus responseStatus = responseStatusAnn.value(); + HttpStatus responseStatus = responseStatusAnn.code(); String reason = responseStatusAnn.reason(); if (!StringUtils.hasText(reason)) { webRequest.getResponse().setStatus(responseStatus.value()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java index 48e3516eb8..674c03942f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolver.java @@ -95,7 +95,7 @@ public class ResponseStatusExceptionResolver extends AbstractHandlerExceptionRes protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - int statusCode = responseStatus.value().value(); + int statusCode = responseStatus.code().value(); String reason = responseStatus.reason(); if (this.messageSource != null) { reason = this.messageSource.getMessage(reason, null, reason, LocaleContextHolder.getLocale()); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java index 4dbbd91cca..5928afd128 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.java @@ -84,7 +84,7 @@ public class ServletInvocableHandlerMethod extends InvocableHandlerMethod { private void initResponseStatus() { ResponseStatus annotation = getMethodAnnotation(ResponseStatus.class); if (annotation != null) { - this.responseStatus = annotation.value(); + this.responseStatus = annotation.code(); this.responseReason = annotation.reason(); } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java index e48d055b3b..cbe11134ec 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java @@ -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") public static class UserAlreadyExistsException extends RuntimeException { } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java index 35dd4368e8..075457cd2c 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerExceptionResolverTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -166,7 +166,7 @@ public class AnnotationMethodHandlerExceptionResolverTests { } @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) { return "Y:" + ClassUtils.getShortName(ex.getClass()); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java index 99b1fc682c..8b99f7732f 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ResponseStatusExceptionResolverTests.java @@ -110,19 +110,16 @@ public class ResponseStatusExceptionResolverTests { @ResponseStatus(HttpStatus.BAD_REQUEST) @SuppressWarnings("serial") private static class StatusCodeException extends Exception { - } - @ResponseStatus(value = HttpStatus.GONE, reason = "You suck!") + @ResponseStatus(code = HttpStatus.GONE, reason = "You suck!") @SuppressWarnings("serial") private static class StatusCodeAndReasonException extends Exception { - } - @ResponseStatus(value = HttpStatus.GONE, reason = "gone.reason") + @ResponseStatus(code = HttpStatus.GONE, reason = "gone.reason") @SuppressWarnings("serial") private static class StatusCodeAndReasonMessageException extends Exception { - } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java index f780690c7b..6cdc290cc1 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -2992,7 +2992,7 @@ public class ServletAnnotationControllerTests { public static class ResponseStatusController { @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 { writer.write("something"); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterIntegrationTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterIntegrationTests.java index dc90c0da2e..e9931b41a5 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterIntegrationTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapterIntegrationTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -353,14 +353,14 @@ public class RequestMappingHandlerAdapterIntegrationTests { return "viewName"; } - @ResponseStatus(value=HttpStatus.ACCEPTED) + @ResponseStatus(HttpStatus.ACCEPTED) @ResponseBody public String handleRequestBody(@RequestBody byte[] bytes) throws Exception { String requestBody = new String(bytes, "UTF-8"); return "Handled requestBody=[" + requestBody + "]"; } - @ResponseStatus(value=HttpStatus.ACCEPTED) + @ResponseStatus(code = HttpStatus.ACCEPTED) @ResponseBody public String handleAndValidateRequestBody(@Valid TestBean modelAttr, Errors errors) throws Exception { return "Error count [" + errors.getErrorCount() + "]"; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java index 0e2cb272a8..cf6bffab9f 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java @@ -2657,7 +2657,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl public static class ResponseStatusController { @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 { writer.write("something"); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java index 0c9f54d7ec..59f8f0ac9b 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethodTests.java @@ -16,9 +16,6 @@ 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.util.ArrayList; import java.util.Arrays; @@ -26,7 +23,6 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; -import org.junit.Before; import org.junit.Test; 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.servlet.view.RedirectView; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; /** * Test fixture with {@link ServletInvocableHandlerMethod}. * * @author Rossen Stoyanchev + * @author Sam Brannen */ 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 public void invokeAndHandle_VoidWithResponseStatus() throws Exception { ServletInvocableHandlerMethod handlerMethod = getHandlerMethod(new Handler(), "responseStatus"); @@ -279,11 +268,11 @@ public class ServletInvocableHandlerMethodTests { return "view"; } - @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ResponseStatus(HttpStatus.BAD_REQUEST) public void responseStatus() { } - @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "400 Bad Request") + @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "400 Bad Request") public String responseStatusWithReason() { return "foo"; } @@ -299,7 +288,6 @@ public class ServletInvocableHandlerMethodTests { } } - @SuppressWarnings("unused") private static class MethodLevelResponseBodyHandler { @ResponseBody @@ -324,12 +312,11 @@ public class ServletInvocableHandlerMethodTests { return new DeferredResult<>(); } - public ResponseEntity handleRawType() { + public ResponseEntity handleRawType() { return ResponseEntity.ok().build(); } } - @SuppressWarnings("unused") private static class ExceptionRaisingReturnValueHandler implements HandlerMethodReturnValueHandler { @Override