From 26f3376b1bed8a305bc6bb2415c4fedf7f63784d Mon Sep 17 00:00:00 2001
From: freelansam <79205526+freelansam@users.noreply.github.com>
Date: Sun, 23 May 2021 21:44:50 +0530
Subject: [PATCH] BAEL-4791: Spring AliasFor Annotation (#10794)
---
spring-core-5/pom.xml | 5 ++
.../java/com/baeldung/aliasfor/MyMapping.java | 29 ++++++++
.../aliasfor/MyMappingController.java | 13 ++++
.../baeldung/aliasfor/AliasForUnitTest.java | 66 +++++++++++++++++++
4 files changed, 113 insertions(+)
create mode 100644 spring-core-5/src/main/java/com/baeldung/aliasfor/MyMapping.java
create mode 100644 spring-core-5/src/main/java/com/baeldung/aliasfor/MyMappingController.java
create mode 100644 spring-core-5/src/test/java/com/baeldung/aliasfor/AliasForUnitTest.java
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]));
+ }
+ }
+ }
+
+}