Nur-Lese-/Nur-Schreib-Vorgänge mit Spring Data Repository Services

Wie wir in unseren vorherigen Tutorials über das Spring Data Repository erfahren haben, handelt es sich um eine Abstraktionsschicht, die über dem persistenten Speicher integriert ist und die Möglichkeit des Zugriffs auf diesen Speicher für die Durchführung von CRUD-Vorgängen nutzt.

Spring-Daten-Repository sich nahtlos in alle Aspekte integriert hat, die für einen Entwickler von Belang sein könnten, einer dieser Aspekte ist die Sicherheit. Sicherheit ist einer der Hauptgründe dafür, dass bestimmte Technologien wichtiger werden, andere jedoch nicht. Das Repository bietet ein offenes Tor für den Zugriff auf den persistenten Speicher mit voller Kapazität für jeden, der die Möglichkeit hat, auf seine Referenz zuzugreifen. Entweder haben diese Entwickler Unterklassen dafür entwickelt, oder irgendjemand hat die Möglichkeit, dieses Repository mit jeder gewünschten Technik zu nutzen, sogar unter Verwendung des RESTful-Prinzips.

lesen Sie auch:

  • Spring Data JPA
  • Spring Data MongoDB
  • Frühlingsdaten Neo4j

Es könnte jedoch Szenarien geben, in denen Sie nur die Lesemethoden (The.) verfügbar machen oder einschränken möchten R In CRUD) oder verhindern Sie einfach, dass die Löschmethoden in Ihrer Repository-Schnittstelle verfügbar gemacht werden, auf die jeder zugreifen kann. Mit Spring Data können Sie jetzt das Basis-Repository mit den folgenden Schritten anpassen:

  • Erstellen Sie eine Schnittstelle, die entweder das Repository erweitert oder mit Anmerkungen versehen ist @Repository Definition.
  • Fügen Sie alle Methoden hinzu, die Sie verfügbar machen möchten, und stellen Sie sicher, dass sie tatsächlich mit den Signaturen der Methoden übereinstimmen, die von den Spring Data Base-Repository-Schnittstellen bereitgestellt werden.
  • Verwenden Sie diese Schnittstelle als Basisschnittstelle für die Schnittstellendeklarationen für Ihre Entitäten.

Um dies zu veranschaulichen, gehen wir davon aus, dass wir nur das offenlegen möchten finde alle()-Methode und verhindert gleichzeitig alle beschreibbaren Methoden. Am Ende dieses Tutorials können Sie den in diesem Beispiel verwendeten Quellcode herunterladen.

1. Federdaten schreibgeschützt/schreibgeschützt

MySQL Die Datenbank enthielt zwei Tabellen, „Adresse“ und „Mitarbeiter“, sowie ein Spring Data Repository zur Abwicklung aller Vorgänge, die Sie möglicherweise benötigen.

Die Repositories werden auf zwei Arten genutzt: Schreibgeschützt Und Nur schreiben. Schreibgeschützt Repositorys bieten uns die Möglichkeit, die in der Datenbank befindlichen Daten zu lesen, während der Schreibvorgang für den Schreibvorgang verwendet wird.

Die von JSF verwaltete Bean verwendet einen Spring-Dienst, um diese beiden Repositorys für die Abwicklung der erforderlichen Vorgänge zu finden. Gleichzeitig werden diese Repositorys auch als RESTful-Dienste exportiert.

Sie sehen das ReadOnly-REST-Repository zum Beibehalten eines Datensatzes in der Datenbank und versuchen andererseits, alle Datensätze der Datenbank mithilfe des WriteOnly-REST-Repository abzurufen.

2. Definieren von Lese-/Schreib-Basisrepositorys

Zusammen mit den genannten Schritten zum Erstellen der erforderlichen Repositorys haben wir zwei Repositorys entwickelt, eines für den Nur-Lese-Vorgang und eines für den reinen Schreibbetrieb.

BaseReadOnlyRepository.java

package net.javabeat.springdata.repo;

import java.io.Serializable;

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

@NoRepositoryBean

public interface BaseReadOnlyRepository<T, ID extends Serializable> extends Repository<T,ID>{
	Iterable<T> findAll();
}

BaseWriteOnlyRepository.java

package net.javabeat.springdata.repo;

import java.io.Serializable;

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

@NoRepositoryBean

public interface BaseWriteOnlyRepository<T, ID extends Serializable> extends Repository<T,ID>{
	<S extends T> S save(S entity);
}

3. Beispiel für ein schreibgeschütztes Repository

In diesem Abschnitt werden wir ein schreibgeschütztes Repository für Mitarbeiter und Adressen entwickeln, das das oben definierte schreibgeschützte Basis-Repository erweitert. Wir würden sehen, welche Auswirkungen die Verwendung von schreibgeschützten Repositorys auf die Ausführung von Schreibvorgängen hat.

EmployeeReadOnlyRepository.java

package net.javabeat.springdata.repo;

import net.javabeat.springdata.jpa.data.Employee;

import org.springframework.data.rest.core.annotation.RestResource;

@RestResource(rel="employeesReadOnly",path="employeeReadOnlyRepository")
public interface EmployeeReadOnlyRepository extends BaseReadOnlyRepository<Employee,Integer>{

}

AddressReadOnlyRepository.java

package net.javabeat.springdata.repo;

import net.javabeat.springdata.jpa.data.Address;

import org.springframework.data.rest.core.annotation.RestResource;

@RestResource(rel="addressesReadOnly",path="addressReadOnlyRepository")
public interface AddressReadOnlyRepository extends BaseReadOnlyRepository<Address,Integer>{

}

RegistrationService.java

package net.javabeat.springdata.beans;

import net.javabeat.springdata.repo.EmployeeReadOnlyRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class RegistrationService {

	@Autowired
	private EmployeeReadOnlyRepository readOnlyRepository;

	public EmployeeReadOnlyRepository getReadOnlyRepository() {
		return readOnlyRepository;
	}

	public void setReadOnlyRepository(EmployeeReadOnlyRepository readOnlyRepository) {
		this.readOnlyRepository = readOnlyRepository;
	}

}

RegistrierungManagedBean.java

package net.javabeat.primefaces.managedbeans;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import net.javabeat.springdata.beans.RegistrationService;
import net.javabeat.springdata.jpa.data.Employee;

import com.google.common.collect.Lists;

@ManagedBean
@SessionScoped
public class RegistrationManagedBean {

	private Employee employee = new Employee();

	private List<Employee> employees = new ArrayList<Employee>();

	@ManagedProperty(value="#{registrationService}")
	private RegistrationService service;

	public Employee getEmployee() {
		return employee;
	}

	public void setEmployee(Employee employee) {
		this.employee = employee;
	}

	public List<Employee> getEmployees() {
		this.employees = Lists.newArrayList(this.service.getReadOnlyRepository().findAll());
		return employees;
	}

	public void setEmployees(List<Employee> employees) {
		this.employees = employees;
	}

	public RegistrationService getService() {
		return service;
	}

	public void setService(RegistrationService service) {
		this.service = service;
	}

}

index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">
	<h:head>
		<script name="jquery/jquery.js" library="primefaces"></script>
	</h:head>
	<f:view>
		<h:form prependId="false">
			<h2>JavaBeat Tutorials</h2>
			<h2>Spring Data + Exposing/Hiding Repository Services</h2>
			<h:panelGrid columns="2">
				<h:outputText value="Enter Employee Name:"/>
				<p:inputText value="#{registrationManagedBean.employee.employeeName}"></p:inputText>
				<h:outputText value="Enter Employee Address Country:"/>
				<p:inputText value="#{registrationManagedBean.employee.address.addressCountry}"></p:inputText>
				<h:outputText value="Enter Employee Address City:"/>
				<p:inputText value="#{registrationManagedBean.employee.address.addressCity}"></p:inputText>
			</h:panelGrid>
			<p:separator/>
			<h:panelGrid columns="1" width="50%">
				<p:dataTable value="#{registrationManagedBean.employees}" var="employee">
					<p:column headerText="Employee's Name">
						<h:outputText value="#{employee.employeeName}"/>
					</p:column>
					<p:column headerText="Employee's Country">
						<h:outputText value="#{employee.address.addressCountry}"/>
					</p:column>
					<p:column headerText="Employee's City">
						<h:outputText value="#{employee.address.addressCity}"/>
					</p:column>
				</p:dataTable>
			</h:panelGrid>
		</h:form>
	</f:view>
</html>

Indem Sie alle erforderlichen Klassen wie erwähnt definieren, sollte Ihre Projektstruktur wie folgt aussehen:

Projekt ist nicht kompilierbar

Wie Sie gesehen haben, ist das Projekt aus einem Grund nicht kompilierbar: EmployeeReadOnlyRepository Support-Service nicht mehr wie speichern.

Speichern ist nicht definiert

Gleichzeitig wurden keine Probleme gemeldet finde alle() Weder innerhalb des Spring-Dienstes noch durch die Verwendung des RESTful-Dienstes, wie Sie sehen würden. Im Folgenden werden zwei Snapshots bereitgestellt, einer für die Verwendung von RegistrationService und der andere für den RESTful-Zugriff.

ReadOnly – Mitarbeiter erfolgreich abgerufen

ReadOnly – Mitarbeiter erfolgreich abgerufen – REST

Der Einfachheit halber haben wir außerdem versucht, einen Mitarbeiterdatensatz zu veröffentlichen, der das ReadOnly-Repository über verwendet REST-SHELL und wir haben den folgenden Fehler:

Mitarbeitereinfügung mithilfe des ReadOnly-Repositorys

Wenn wir den gleichen Vorgang für das WriteOnly-Repository verwenden, erhalten wir eine Erfolgsmeldung und der Mitarbeiter wurde erstellt.

Mitarbeitereinfügung mithilfe des WriteOnly-Repositorys

Und durch die Durchsicht der Datensätze in der Datenbank haben wir sichergestellt, dass sich der Mitarbeiter tatsächlich dort aufgehalten hat.

Echte Mitarbeitereingliederung

Möglicherweise fragen Sie nach der Mitarbeiter-ID, die sich von der im Beitrag verwendeten unterscheidet. Die Antwort ist, dass die MySQL-Datenbank die übergebene EmployeeId ignoriert und deren Sequenz verwendet hat. Suchen Sie unten nach einer weiteren Anfrage ohne Angabe Angestellten ID.

Erstellen Sie einen Mitarbeiter, ohne die Mitarbeiter-ID anzugeben Echte Mitarbeitereinfügung – ohne Verwendung der EmployeeId

Durch die Verwendung von Spring- oder RESTful-Methoden werden die Mitarbeiter erfolgreich aus MySQL abgerufen. Im ersten Snapshot wurde eine Primefaces-Ansicht zur Anzeige der Mitarbeiter und ihrer jeweiligen Adressen verwendet und im zweiten wurden alle Mitarbeiter und ihre jeweiligen Adressen mithilfe des RESTful-Aufrufs angezeigt.

4. Beispiel für ein „Nur schreiben“-Repository

In diesem Abschnitt werden wir ein schreibgeschütztes Repository für Mitarbeiter und Adressen entwickeln, das das oben definierte schreibgeschützte Basis-Repository erweitert. Wir würden sehen, welche Auswirkungen die Verwendung von Nur-Schreib-Repositorys auf die Ausführung von Lesevorgängen mithilfe des RESTful-Dienstes hat.

EmployeeWriteOnlyRepository.java

package net.javabeat.springdata.repo;

import net.javabeat.springdata.jpa.data.Employee;

import org.springframework.data.rest.core.annotation.RestResource;

@RestResource(rel="employeesWriteOnly",path="employeeWriteOnlyRepository")
public interface EmployeeWriteOnlyRepository extends BaseWriteOnlyRepository<Employee,Integer>{

}

AddressWriteOnlyRepository.java

package net.javabeat.springdata.repo;

import net.javabeat.springdata.jpa.data.Address;

import org.springframework.data.rest.core.annotation.RestResource;

@RestResource(rel="addressesWriteOnly",path="addressWriteOnlyRepository")
public interface AddressWriteOnlyRepository extends BaseWriteOnlyRepository<Address,Integer>{

}

RegistrationService.java

package net.javabeat.springdata.beans;

import net.javabeat.springdata.repo.EmployeeWriteOnlyRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class RegistrationService {

	@Autowired
	private EmployeeWriteOnlyRepository writeOnlyRepository;

	public EmployeeWriteOnlyRepository getWriteOnlyRepository() {
		return writeOnlyRepository;
	}

	public void setWriteOnlyRepository(
			EmployeeWriteOnlyRepository writeOnlyRepository) {
		this.writeOnlyRepository = writeOnlyRepository;
	}

}

RegistrationManagedBean.java

package net.javabeat.primefaces.managedbeans;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import net.javabeat.springdata.beans.RegistrationService;
import net.javabeat.springdata.jpa.data.Employee;

@ManagedBean
@SessionScoped
public class RegistrationManagedBean {

	private Employee employee = new Employee();

	private List<Employee> employees = new ArrayList<Employee>();

	@ManagedProperty(value="#{registrationService}")
	private RegistrationService service;

	public Employee getEmployee() {
		return employee;
	}

	public void setEmployee(Employee employee) {
		this.employee = employee;
	}

	public List<Employee> getEmployees() {
		return employees;
	}

	public void setEmployees(List<Employee> employees) {
		this.employees = employees;
	}

	public RegistrationService getService() {
		return service;
	}

	public void setService(RegistrationService service) {
		this.service = service;
	}

	public String register(){
		this.service.getWriteOnlyRepository().save(this.employee);
		return "";
	}

}

Ebenso wie die Auswirkungen der Verwendung des schreibgeschützten Repositorys werden alle mit dem Lesen verbundenen Dienste eliminiert und der Compiler wird sich darüber beschweren.

Nur Schreiben – FindAll verursacht einen Fehler

Der RESTful-Dienst wird zwar nicht weit vom gleichen Ergebnis abweichen, aber mit anderen Worten.

RESTful Read Employees ist fehlgeschlagen

Auch wenn Sie die REST-SHELL zum Lesen eines Mitarbeiters aus dem WriteOnly-Repository verwenden, indem Sie den Vorgang ausführen Liste was bedeutet finde alle()erhalten Sie das gleiche Ergebnis.

Lesen Sie Mitarbeiter mithilfe des WriteOnly-Repositorys – REST SHELL

5. Zusammenfassung

Spring-Datenrepositorys, haben die Möglichkeit, die von ihnen bereitgestellten Dienste anzuzeigen/auszublenden. Indem eine Basisschnittstelle nur zum Lesen erstellt wird, sollten alle Schnittstellen, die sie erweitern, als READ-NUR-Schnittstelle dienen. Wenn ein Teil versucht, die Daten über das READ-NUR-Repository zu lesen, wird eine Fehlermeldung angezeigt. Das gleiche Problem tritt auf, wenn es darum geht, Schnittstellen zum Schreiben zu erstellen.

In diesem Tutorial wird ausführlich erklärt, wie Sie Ihre Repositorys schreibgeschützt oder schreibgeschützt machen können. Außerdem werden Ihnen die möglichen Ausnahmen und Fehler angezeigt, die auftreten können, wenn Sie gegen die Regeln des Spring Data Repository verstoßen.

Laden Sie den Quellcode herunter

[wpdm_file id=114]

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen