Support attribute overrides with @ResponseStatus
This commit introduces support for attribute overrides for @ResponseStatus when @ResponseStatus is used as a meta-annotation on a custom composed annotation. Specifically, this commit migrates all code that looks up @ResponseStatus from using AnnotationUtils.findAnnotation() to using AnnotatedElementUtils.findMergedAnnotation(). Issue: SPR-13441
This commit is contained in:
@@ -16,8 +16,12 @@
|
||||
|
||||
package org.springframework.test.web.servlet.samples.standalone.resultmatchers;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.core.annotation.AliasFor;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
@@ -26,6 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.springframework.http.HttpStatus.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
|
||||
@@ -34,6 +39,7 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
|
||||
* Examples of expectations on the status and the status reason found in the response.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Sam Brannen
|
||||
*/
|
||||
public class StatusAssertionTests {
|
||||
|
||||
@@ -42,12 +48,14 @@ public class StatusAssertionTests {
|
||||
@Test
|
||||
public void testStatusInt() throws Exception {
|
||||
this.mockMvc.perform(get("/created")).andExpect(status().is(201));
|
||||
this.mockMvc.perform(get("/createdWithComposedAnnotation")).andExpect(status().is(201));
|
||||
this.mockMvc.perform(get("/badRequest")).andExpect(status().is(400));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHttpStatus() throws Exception {
|
||||
this.mockMvc.perform(get("/created")).andExpect(status().isCreated());
|
||||
this.mockMvc.perform(get("/createdWithComposedAnnotation")).andExpect(status().isCreated());
|
||||
this.mockMvc.perform(get("/badRequest")).andExpect(status().isBadRequest());
|
||||
}
|
||||
|
||||
@@ -66,27 +74,43 @@ public class StatusAssertionTests {
|
||||
|
||||
@Test
|
||||
public void testReasonMatcher() throws Exception {
|
||||
this.mockMvc.perform(get("/badRequest"))
|
||||
.andExpect(status().reason(endsWith("token")));
|
||||
this.mockMvc.perform(get("/badRequest")).andExpect(status().reason(endsWith("token")));
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping
|
||||
@ResponseStatus
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface Get {
|
||||
|
||||
@AliasFor(annotation = RequestMapping.class, attribute = "path")
|
||||
String[] path() default {};
|
||||
|
||||
@AliasFor(annotation = ResponseStatus.class, attribute = "code")
|
||||
HttpStatus status() default INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
|
||||
@Controller
|
||||
private static class StatusController {
|
||||
|
||||
@RequestMapping("/created")
|
||||
@ResponseStatus(HttpStatus.CREATED)
|
||||
@ResponseStatus(CREATED)
|
||||
public @ResponseBody void created(){
|
||||
}
|
||||
|
||||
@Get(path = "/createdWithComposedAnnotation", status = CREATED)
|
||||
public @ResponseBody void createdWithComposedAnnotation() {
|
||||
}
|
||||
|
||||
@RequestMapping("/badRequest")
|
||||
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "Expired token")
|
||||
@ResponseStatus(code = BAD_REQUEST, reason = "Expired token")
|
||||
public @ResponseBody void badRequest(){
|
||||
}
|
||||
|
||||
@RequestMapping("/notImplemented")
|
||||
@ResponseStatus(HttpStatus.NOT_IMPLEMENTED)
|
||||
@ResponseStatus(NOT_IMPLEMENTED)
|
||||
public @ResponseBody void notImplemented(){
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user