diff --git a/spring-core-5/pom.xml b/spring-core-5/pom.xml index 68229b80b8..1c2e80be44 100644 --- a/spring-core-5/pom.xml +++ b/spring-core-5/pom.xml @@ -19,6 +19,11 @@ spring-boot-starter ${spring-boot-starter.version} + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-starter.version} + org.springframework.boot spring-boot-starter-test diff --git a/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java new file mode 100644 index 0000000000..05263297b5 --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java @@ -0,0 +1,29 @@ +package com.baeldung.aliasfor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.core.annotation.AliasFor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@RequestMapping +public @interface MyMapping { + + @AliasFor(annotation = RequestMapping.class, attribute = "method") + RequestMethod[] action() default {}; + + @AliasFor(annotation = RequestMapping.class, attribute = "path") + String[] value() default {}; + + @AliasFor(annotation = RequestMapping.class, attribute = "path") + String[] mapping() default {}; + + @AliasFor(annotation = RequestMapping.class, attribute = "path") + String[] route() default {}; + +} diff --git a/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java new file mode 100644 index 0000000000..c3dc2784f8 --- /dev/null +++ b/spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java @@ -0,0 +1,13 @@ +package com.baeldung.aliasfor; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class MyMappingController { + + @MyMapping(action = RequestMethod.PATCH, route = "/test") + public void mappingMethod() { + } + +} diff --git a/spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java b/spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java new file mode 100644 index 0000000000..449a55a6f8 --- /dev/null +++ b/spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung.aliasfor; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; + +import java.lang.reflect.Method; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = MyMappingController.class) +public class AliasForUnitTest { + + @Autowired + private ConfigurableApplicationContext context; + + Class controllerClass; + + @Before + public void setControllerBean() { + MyMappingController controllerBean = context.getBean(MyMappingController.class); + controllerClass = controllerBean.getClass(); + } + + @Test + public void givenComposedAnnotation_whenExplicitAlias_thenMetaAnnotationAttributeOverridden() { + + for (Method method : controllerClass.getMethods()) { + if (method.isAnnotationPresent(MyMapping.class)) { + MyMapping annotation = AnnotationUtils.findAnnotation(method, MyMapping.class); + RequestMapping metaAnnotation = AnnotationUtils.findAnnotation(method, RequestMapping.class); + + assertEquals(RequestMethod.PATCH, annotation.action()[0]); + + assertEquals(0, metaAnnotation.method().length); + } + } + } + + @Test + public void givenComposedAnnotation_whenImplictAlias_thenAttributesEqual() { + for (Method method : controllerClass.getMethods()) { + if (method.isAnnotationPresent(MyMapping.class)) { + MyMapping annotationOnBean = AnnotationUtils.findAnnotation(method, MyMapping.class); + + assertTrue(annotationOnBean.mapping()[0].equals(annotationOnBean.route()[0])); + assertTrue(annotationOnBean.value()[0].equals(annotationOnBean.route()[0])); + } + } + } + +}