[JAVA] Greifen Sie dynamisch auf die durch die Zeichenfolge in Spring BeanWrapper angegebene Eigenschaft zu

1. Zuallererst

Dieses Mal möchte ich vorstellen, wie Sie mit BeanWrapper von Spring Framework dynamisch auf die durch die Zeichenfolge angegebene Eigenschaft zugreifen können. Eine kurze Beschreibung von "BeanWrapper" lautet "API zum Festlegen und Abrufen von Eigenschaftswerten ohne Verwendung von Setzern und Gettern". Wenn Sie an eine Bibliothek denken, die dynamisch auf Eigenschaften zugreift, denken Sie möglicherweise an "Apache Commons BeanUtils", jedoch für denselben Zweck. Es ist eine Funktion von.

1.1. Was ist BeanWrapper?

Offizielle Richtlinien für Spring Framework (Core) "3.4. Bean-Manipulation und Bean Wrapper" Aber es ist gut eingeführt. Die grundlegende Verwendung ist wie folgt.

Die Regeln für die Angabe von Eigenschaften (Ausdrücke) sind ebenfalls in den offiziellen Richtlinien enthalten.

Table 11. Examples of properties

Expression Explanation
name Indicates the property name corresponding to the methods getName() or isName() and setName(..)
account.name Indicates the nested property name of the property account corresponding e.g. to the methods getAccount().setName() or getAccount().getName()
account[2] Indicates the third element of the indexed property account. Indexed properties can be of type array, list or other naturally ordered collection
account[COMPANYNAME] Indicates the value of the map entry indexed by the key COMPANYNAME of the Map property account

Die grundlegende Verwendung wird erklärt, aber leider gibt es kein Beispiel für den Betrieb der Sammlung (account [2] oder account [COMPANYNAME]). Dieses Mal möchte ich ein Beispiel dieser Sammlung erklären.

2.1 Verwendung von BeanWrapper

Bei der Bearbeitung von Sammlungseigenschaften hängt die Verwendung von der Bearbeitungstiefe ab. Dieses Mal möchte ich die folgenden zwei Muster erklären.

BeanWrapperDemo.java


package demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

public class BeanWrapperDemo {

	public static void main(String[] args) {
		//Legen Sie die Elemente fest, die in der Sammlung gespeichert werden sollen
		test01();
		//Legen Sie Werte für die Eigenschaften der in der Auflistung gespeicherten Elemente fest
		test02();
	}

	//★ Punkt 1
	private static void setPropertyValues(Object target, Map<String, Object> input) {
		BeanWrapper wrapper = new BeanWrapperImpl(target);
		for (String key : input.keySet()) {
			wrapper.setPropertyValue(key, input.get(key));
		}
	}
	
	//Legen Sie die Elemente fest, die in der Sammlung gespeichert werden sollen
	private static void test01() {
		try {
			//★ Punkt 2
			Team team = new Team();
			List<Member> memberList = new ArrayList<>();
			Map<String, Item> items = new HashMap<>();
			team.setMemberList(memberList);
			team.setItems(items);
			
			Member taro = new Member();
			taro.setMail("[email protected]");
			taro.setName("TARO YAMADA");
			Member hanako = new Member();
			hanako.setMail("[email protected]");
			hanako.setName("HANAKO TOYOSU");
			
			Item notepc = new Item();
			notepc.setItemName("Notebook");
			notepc.setPrice(100000);
			Item book = new Item();
			book.setItemName("Eine gründliche Einführung in den Frühling");
			book.setPrice(4000);
			
			Map<String, Object> input = new HashMap<>();
			input.put("teamId", "01234");
			input.put("teamName", "HelloWorld");
			input.put("point", 100);
			//★ Punkt 3
			input.put("memberList[0]", taro);
			input.put("memberList[1]", hanako);
			input.put("items[A01]", notepc);
			input.put("items[A02]", book);
			
			setPropertyValues(team, input);
			System.out.println(team);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	//Legen Sie Werte für die Eigenschaften der in der Auflistung gespeicherten Elemente fest
	private static void test02() {
		try {
			//★ Punkt 4
			Team team = new Team();
			List<Member> memberList = new ArrayList<>();
			memberList.add(new Member());
			memberList.add(new Member());
			Map<String, Item> items = new HashMap<>();
			items.put("A01", new Item());
			items.put("A02", new Item());

			team.setMemberList(memberList);
			team.setItems(items);
			
			Map<String, Object> input = new HashMap<>();
			input.put("teamId", "01234");
			input.put("teamName", "HelloWorld");
			input.put("point", 100);
			//★ Punkt 5
			input.put("memberList[0].mail", "[email protected]");
			input.put("memberList[0].name", "TARO YAMADA");
			input.put("memberList[1].mail", "[email protected]");
			input.put("memberList[1].name", "HANAKO TOYOSU");
			input.put("items[A01].itemName", "Notebook");
			input.put("items[A01].price", 100000);
			input.put("items[A02].itemName", "Eine gründliche Einführung in den Frühling");
			input.put("items[A02].price", 4000);
			
			setPropertyValues(team, input);
			System.out.println(team);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}

** ★ Punkt 1 ** Erstellen Sie eine Instanz von BeanWrapper. org.springframework.beans.BeanWrapper ist eine Schnittstelle. Die Implementierungsklasse ist org.springframework.beans.BeanWrapperImpl, und es gibt mehrere Konstruktoren, aber dieses Mal verwenden wir den, der ein Objekt als Argument verwendet. Verwenden Sie die Methode setPropertyValue, um den Wert festzulegen. Das erste Argument ist die Regel (Ausdruck), die die Eigenschaft angibt, und das zweite Argument ist der Wert, den Sie festlegen möchten. Weitere Informationen finden Sie unter Javadoc.

** ★ Punkt 2 ** Bei "Festlegen der Elemente, die in der Sammlung gespeichert werden sollen" muss die Zielsammlung instanziiert werden. Der Inhalt der Sammlung ist nicht erforderlich.

** ★ Punkt 3 ** Um die in der Sammlung zu speichernden Elemente festzulegen, geben Sie mit [] die Position der Elemente in der Sammlung an.

** ★ Punkt 4 ** Wenn Sie einen Wert für eine Eigenschaft eines in einer Auflistung gespeicherten Elements festlegen möchten, muss dieses Element der Zielauflistung ebenfalls instanziiert werden.

** ★ Punkt 5 ** Nachdem Sie den Speicherort der Sammlung mit "[]" angegeben haben, geben Sie die Eigenschaft an, die mit ". Property name" festgelegt werden soll. Eine Ausnahme wird ausgelöst, wenn die Elemente der Zielsammlung nicht instanziiert werden. Daher ist es notwendig, das zu betätigende Element an ★ Punkt 4 im Voraus zu instanziieren.

2.2 (Referenz) Definition der Modellklasse (POJO)

Als Referenz werden die Modellklassen aufgelistet, damit Sie die verschachtelte Auflistung sehen können.

Team.java


package demo;

import java.util.List;
import java.util.Map;

public class Team {
	private String teamId;
	private String teamName;
	private int point;
	private List<Member> memberList;
	private Map<String, Item> items;

	// setter,getter omitted
	// override toString generated by eclipse
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Team [teamId=");
		builder.append(teamId);
		builder.append(", teamName=");
		builder.append(teamName);
		builder.append(", point=");
		builder.append(point);
		builder.append(", memberList=");
		builder.append(memberList);
		builder.append(", items=");
		builder.append(items);
		builder.append("]");
		return builder.toString();
	}
}

Member.java


package demo;

import java.util.Map;

public class Member {
	private String mail;
	private String name;
	private Map<String, String> memo;

	// setter,getter omitted
	// override toString generated by eclipse
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Member [mail=");
		builder.append(mail);
		builder.append(", name=");
		builder.append(name);
		builder.append(", memo=");
		builder.append(memo);
		builder.append("]");
		return builder.toString();
	}
}

Item.java


package demo;

public class Item {
	private String itemName;
	private int price;

	// setter,getter omitted
	// override toString generated by eclipse
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Item [itemName=");
		builder.append(itemName);
		builder.append(", price=");
		builder.append(price);
		builder.append("]");
		return builder.toString();
	}
}

3. Schließlich

Dieses Mal habe ich erklärt, wie Sie mit BeanWrapper von Spring Framework dynamisch auf die durch die Zeichenfolge angegebene Eigenschaft zugreifen können. ** Es ist ein praktischer "BeanWrapper", aber es ist natürlich besser, gewöhnlichen "Setter, Getter" für die Verarbeitungsleistung zu verwenden. ** ** ** Ich denke, die Verwendung von "BeanWrapper" ist (1) eine allgemeine Verarbeitung, die einen dynamischen Zugriff erfordert, und (2) das Festlegen von Eingabewerten in der Testklasse, indem die Bequemlichkeit genutzt wird, Eigenschaften mit Zeichenfolgen angeben zu können.

Recommended Posts

Greifen Sie dynamisch auf die durch die Zeichenfolge in Spring BeanWrapper angegebene Eigenschaft zu
Fügen Sie die Datei in die Eigenschaften eines Strings mit Spring XML-Konfiguration ein
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
So erhalten Sie den Einstellungswert (Eigenschaftswert) aus der Datenbank in Spring Framework
[Java] Teilen Sie eine Zeichenfolge durch ein angegebenes Zeichen
Spring Autowired wird im Konstruktor geschrieben
Statische Dateizugriffspriorität beim Spring Boot
Löscht nach dem angegebenen Zeichen aus der Zeichenfolge
Wechseln der Beans mit Profilanmerkung im Frühjahr
Nach mehreren Feldern in der Klasse sortieren
[Spring Boot] So rufen Sie Eigenschaften dynamisch aus einer in einer URL enthaltenen Zeichenfolge ab
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde