Java >> Java Tutorial >  >> Tag >> Spring

Spring @AliasFor Anmerkungsbeispiel

In diesem Beispiel zeigen wir, wie die Annotation @AliasFor in Spring verwendet wird.

1. Einführung

Anmerkungen sind Decorators, die Metadaten zu Klassen, Methoden, Parametern oder Feldern bereitstellen. Abhängig von der Anmerkung können Metadaten zur Kompilierzeit und/oder Laufzeit verarbeitet werden. Beispiele für Anmerkungen sind:

  • JUnit-Anmerkungen (@Test, @Before, @After)
  • JPA-Anmerkungen (@Entity, @Table, @Id)
  • Spring Framework-Anmerkungen (@Controller, @Configuration, @Autowired)

Meta-Anmerkungen sind Anmerkungen, die auf andere Anmerkungen angewendet werden. Dies gibt uns die Möglichkeit, zusammengesetzte Anmerkungen zu erstellen. Zum Beispiel der @RestController Anmerkung ist mit @Controller meta-annotiert und @ResponseBody .

Eine Anmerkung kann null, ein oder mehrere Attribute haben. Im Frühjahr wird die @AliasFor Annotation gibt uns die Möglichkeit, ein Attribut als Alias ​​für ein anderes Attribut zu verwenden.

Das @AliasFor Annotation wird in den folgenden Fällen verwendet:

  • Anwenden von @AliasFor auf einem Attributpaar innerhalb einer einzelnen Anmerkung, sodass wir die Attribute austauschbar verwenden können
  • Anwenden von @AliasFor auf einem Attribut in einer zusammengesetzten Anmerkung, wodurch das Attribut in der Meta-Anmerkung überschrieben wird

In diesem Artikel stellen wir Beispiele für beide oben aufgeführten Fälle vor.

1.1 In diesem Beispiel verwendete Tools

  • Eclipse-IDE für Enterprise-Java-Entwickler Version:2019-06 (4.13.0)
  • Spring Tools 4 – für Spring Boot
  • Postbote 7.15.0

Spring Tools 4 für Spring Boot ist eine Reihe von Plugins für Eclipse, die das Erstellen und Ausführen von Spring Boot-Anwendungen unterstützen. Sie können Spring Tools 4 zu Ihrer bestehenden Eclipse-Installation hinzufügen, indem Sie zum Eclipse Marketplace gehen und nach „Spring Tools 4“ suchen.

Sie können Postman hier herunterladen.

2. Spring @AliasFor Annotation Beispiel

2.1 Erstellen Sie Aliase innerhalb einer Anmerkung

Wir können @AliasFor verwenden auf einem Attributpaar innerhalb einer einzelnen Anmerkung. Dadurch können wir die Attribute austauschbar verwenden. Dies ist in bestimmten Situationen sinnvoll. Beispiel:Pfad ist ein Alias ​​für Wert (und umgekehrt) in @RequestMapping Anmerkung. Da der Wert -Attribut kann bei der Deklaration seines Parameters weggelassen werden, @RequestMapping(“/students”) ist eine Abkürzung für @RequestMapping(path = “/students”) .

2.1.1 Erstellen Sie das Spring Boot-Projekt

Im Neues Projekt – Wählen Sie einen Assistenten Erweitern Sie im Dialogfeld Spring Boot und wählen Sie Spring Starter Project. Weiter klicken".

Im Neuen Spring Starter-Projekt Geben Sie im Dialogfeld einen Namen für das Projekt ein. Geben Sie außerdem die Gruppen-, Artefakt- und Paketinformationen ein. Übernehmen Sie alle anderen Standardwerte. Weiter klicken".

In den Neuen Spring Starter-Projektabhängigkeiten Dialogfenster klicken Sie auf „Fertig stellen“. (Für dieses Beispiel benötigen wir keine Abhängigkeiten.)

2.1.2 Erstellen Sie die Anmerkungsklasse

Erstellen Sie ein neues Paket com.javacodegeeks.examples.annotation . Klicken Sie mit der rechten Maustaste auf das Paket und wählen Sie Neu -> Anmerkung aus . Geben Sie im Fenster „Neuer Anmerkungstyp“ MeineAnmerkung ein für den Namen. Aktivieren Sie das Kontrollkästchen @Retention hinzufügen Kontrollkästchen und wählen Sie die Laufzeit aus Radio knopf. Aktivieren Sie außerdem das Kontrollkästchen @Target hinzufügen Kontrollkästchen und aktivieren Sie das Feld Kontrollkästchen. Klicken Sie auf Fertig stellen.

Fügen Sie den folgenden Code zu MyAnnotation hinzu :MeineAnmerkung.java

import org.springframework.core.annotation.AliasFor;

@Retention(RUNTIME)
@Target(FIELD)
public @interface MyAnnotation {

	@AliasFor("name")
	String value() default "";
	
	@AliasFor("value")
	String name() default "";	
}

2.1.3 Erstellen Sie die Bean-Klasse

Lassen Sie uns eine Spring-Bean mit zwei Eigenschaften erstellen und unsere Anmerkung auf beide anwenden. Erstellen Sie eine Klasse MyBean in com.javacodegeeks.examples und fügen Sie den folgenden Code hinzu:MyBean.java

import com.javacodegeeks.examples.annotation.MyAnnotation;

public class MyBean {

	@MyAnnotation(value = "Hello")
	private String prop_a;
	
	@MyAnnotation(name = "World!")
	private String prop_b;
}

Die erste Eigenschaft wird mit dem Wert kommentiert -Attribut, während die zweite Eigenschaft mit dem Namen kommentiert wird Attribut. Da diese Attribute austauschbar sind, ist das Ergebnis dasselbe. Wir werden dies später in unserem JUnit-Test sehen.

2.1.4 Erstellen Sie die Konfigurationsklasse

Als Nächstes erstellen wir eine Spring-Konfigurationsklasse, damit wir MyBean registrieren können im Spring IoC-Container. Erstellen Sie ein Paket com.javacodegeeks.examples.config und eine Klasse MyConfig mit folgendem Code:MyConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.javacodegeeks.examples.MyBean;

@Configuration
public class MyConfig {

	@Bean
	public MyBean myBean() {
		return new MyBean();
	}
}

2.1.5 Erstellen Sie den JUnit-Testfall

Klicken Sie mit der rechten Maustaste auf com.javacodegeeks.examples Paket unter src/test/java und wählen Sie Neu -> Andere -> JUnit-Testfall aus . Weiter klicken.

Geben Sie AliasForTest ein als Name und klicken Sie auf Fertig stellen.

Entfernen Sie den eingebetteten Test und fügen Sie den folgenden Code hinzu:AliasForTest.java

import static java.util.Objects.requireNonNull;
import static org.junit.jupiter.api.Assertions.*;

import java.lang.reflect.Field;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;

import com.javacodegeeks.examples.annotation.MyAnnotation;

@SpringBootTest
class AliasForTest {
	
	@Autowired
	private ConfigurableApplicationContext context;

	@Test
	void testAtributeValues() {
		MyBean bean = context.getBean(MyBean.class);
		Class objectClass = requireNonNull(bean).getClass();
		for (Field field : objectClass.getDeclaredFields()) {
			if (field.isAnnotationPresent(MyAnnotation.class)) {
				System.out.println("\nfield name: "+field.getName());
				MyAnnotation annotationOnBean = AnnotationUtils.findAnnotation(field, MyAnnotation.class);
				System.out.println("attribute \"value\": "+annotationOnBean.value());
				System.out.println("attribute \"name\": "+annotationOnBean.name());
				assertTrue(annotationOnBean.value().equals(annotationOnBean.name())
					, "The value and name attributes are not the same");
			}
		}
	}
}

Auf Klassenebene:

  • Die @SpringBootTest Annotation wird verwendet, um den IoC-Container zu booten.
  • Die ConfigurableApplicationContext wird mit @Autowired eingefügt . Es wird als unser Handle für den Container verwendet.

Die Testmethode führt Folgendes aus:

  • Ruft MyBean ab aus dem Kontext
  • Erhält den Class Objekt, das die Bean repräsentiert und gleichzeitig sicherstellt, dass es nicht null ist
  • Iteriert über das Array von Field Objekte der Class Objekt
  • Überprüfen Sie, ob Field ist mit MyAnnotation annotiert
  • Suchen und rufen Sie die Anmerkung von Field ab mit dem AnnotationUtils.findAnnotation Statische Utility-Methode.

Sobald wir die Anmerkung im Griff haben, drucken wir die Werte des Werts aus und Name Attribute. Wir behaupten dann, dass beide Werte gleich sind.

Klicken Sie mit der rechten Maustaste auf die Testklasse und wählen Sie Ausführen als -> JUnit-Test aus . In der Konsolenausgabe sehen Sie Folgendes.

Started AliasForTest in 1.354 seconds (JVM running for 2.938)

field name: prop_a
attribute "value": Hello
attribute "name": Hello

field name: prop_b
attribute "value": World!
attribute "name": World!

Sie können sehen, dass die Werte für den Namen und Wert Attribute sind gleich. Sie werden auch sehen, dass der Test bestanden wurde.

2.2 Aliase in einer zusammengesetzten Anmerkung erstellen

2.2.1 Archiv herunterladen

Laden Sie zunächst die ZIP-Datei aus dem Download-Bereich herunter und extrahieren Sie sie in einen Ordner Ihrer Wahl.

2.2.2 Importieren Sie das Spring Boot REST Starter-Projekt

Klicken Sie auf Datei -> Importieren… und wählen Sie Projekte aus Ordner oder Archiv aus . Klicken Sie auf Weiter .

Klicken Sie auf das Archiv… klicken und die REST-API-Starter.zip auswählen Datei aus dem Ordner, in dem das Archiv extrahiert wurde. Wählen Sie das Eclipse-Projekt aus der Liste aus und klicken Sie auf Fertig stellen .

Nach dem Importieren des Projekts müssen Sie es möglicherweise aktualisieren. Klicken Sie mit der rechten Maustaste auf REST-API-Starter und wählen Sie Maven -> Update Project.. und wählen Sie das Projekt aus der Liste aus. OK klicken.

2.2.3 Erstellen Sie die zusammengesetzte Anmerkung

Angenommen, Sie haben eine REST-API-Anwendung mit CRUD-Vorgängen für mehrere Ressourcen. Wenn eine Ressource nicht gefunden wird, möchten Sie den HTTP-Statuscode 4O4 (Not Found) zurückgeben. Angenommen, Sie verwenden den @ResponseStatus Anmerkung dazu. Anstatt den Status jedes Mal anzugeben, wenn Sie die Anmerkung verwenden (mit @ResponseStatus(HttpStatus.NOT_FOUND ) können Sie eine zusammengesetzte Anmerkung erstellen, die den Statuscode fest codiert, Ihnen aber dennoch erlaubt, den Grund anzugeben Attribut von @ResponseStatus Anmerkung.

Erstellen Sie ein neues Paket com.javacodegeeks.example.annotation und Anmerkungstyp NotFoundResponseStatus . Aktivieren Sie das Kontrollkästchen „@Retention hinzufügen“ und wählen Sie das Optionsfeld „Laufzeit“ aus. Aktivieren Sie außerdem das Kontrollkästchen „@Target hinzufügen“ und die Kontrollkästchen „Typ“ und „Methode“. Klicken Sie auf Fertig stellen und fügen Sie den folgenden Code hinzu:NotFoundResponseStatus.java

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@Retention(RUNTIME)
@Target({ TYPE, METHOD })
@ResponseStatus(code = HttpStatus.NOT_FOUND)
public @interface NotFoundResponseStatus {

	@AliasFor(annotation = ResponseStatus.class)
	public abstract String reason() default "";
}

Beachten Sie, dass wir eine Meta-Anmerkung hinzugefügt haben – @ResponseStatus – und den Code hartcodiert Attribut zu HttpStatus.NOT_FOUND . Wir haben auch einen Alias ​​für den Grund hinzugefügt -Attribut, das im Wesentlichen den Grund überschreibt Attribut von @ResponseStatus Anmerkung.

2.2.4 Aktualisieren Sie die RestController-Klasse

Der von @ResponseStatus zurückgegebene Standardstatus ist HttpStatus.INTERNAL_SERVER_ERROR (500). Lassen Sie uns dies überprüfen. Öffnen Sie StudentController.java aus dem com.javacodegeeks.example.controller Paket und entfernen Sie den HttpStatus.NOT_FOUND Parameter aus der folgenden Zeile:StudentController.java

@RestController
@RequestMapping("/students")
public class StudentController {

	private final StudentRepository repository;

	@Autowired
	public StudentController(StudentRepository repository) {
		this.repository = repository;
	}
	
	@SuppressWarnings("serial")
	@ResponseStatus
	class StudentNotFoundException extends RuntimeException {

		public StudentNotFoundException() {
			super("Student does not exist");
		}
	}
more code...
}

Speichern Sie die Änderung und starten Sie die Anwendung. Starten Sie nun Postman und schließen Sie das Dialogfeld „Neu erstellen“. Im oberen Teil des Fensters wählen Sie die HTTP-Methode aus und geben die Anforderungs-URL ein. Im unteren Teil des Fensters wird die Antwort angezeigt.

Öffnen Sie einen neuen Tab. Geben Sie die Anforderungs-URL http://localhost:8080/students/10 ein 6 und klicken Sie auf Senden. Sie werden sehen, dass der Standardfehlercode verwendet wird.

2.2.5 Aktualisieren Sie die Anmerkung zur Ausnahmeklasse

Lassen Sie uns den @ResponseStatus ersetzen mit unserer zusammengesetzten Anmerkung @NotFoundResponseStatus auf StudentNotFoundException Klasse und entfernen Sie den Konstruktor. (Zuweisung des Grundes Attribut in @NotFoundResponseStatus macht den Konstruktor überflüssig.) Bearbeiten Sie StudentController wie folgt:StudentController.java

	@RestController
@RequestMapping("/students")
public class StudentController {

	private final StudentRepository repository;

	@Autowired
	public StudentController(StudentRepository repository) {
		this.repository = repository;
	}
	
	@SuppressWarnings("serial")
	@NotFoundResponseStatus(reason = "Student not Found")
	class StudentNotFoundException extends RuntimeException {}
more code...
}

Speichern Sie die Änderungen und starten Sie die Anwendung neu. Führen Sie nun den vorherigen Test in Postman aus. Sie werden sehen, dass die Ausnahme jetzt unseren hartcodierten Statuscode zusammen mit unserem angegebenen Grund zurückgibt.

3. Spring @AliasFor – Zusammenfassung

In diesem Beitrag haben wir gezeigt, wie man @AliasFor verwendet Annotation innerhalb einer einzigen Annotation, um es uns zu ermöglichen, ein Attributpaar austauschbar zu verwenden. Wir haben auch gezeigt, wie man @AliasFor verwendet in einer zusammengesetzten Anmerkung, um Attribute in einer Meta-Anmerkung zu überschreiben.

4. Laden Sie den Quellcode herunter

Dies war ein Spring @AliasFor Annotation Example.annotations spring spring annotations

Java-Tag