[JAVA] Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).

Implementierung eines einfachen Web-REST-API-Servers mit Spring Boot + MySQL - Qiita

Outline Implementieren Sie die Domänenschicht gemäß dem folgenden Entwurf. Betrachten Sie die von Spring Boot --Qiita implementierte Architektur der Web-API

Erstellen Sie die folgenden 3 Klassen als Domänenebene.

├── domain
│   ├── object
│   │   └── User.java
│   ├── repository
│   │   └── UserRepository.java
│   └── service
│       └── UserService.java

User.java Eine Klasse zum Ausdrücken des Konzepts eines Benutzers in einer Anwendung. Diesmal gibt es kein bestimmtes Verhalten. Halten Sie einfach die erforderlichen Informationen bereit. Es wird kurz mit Lombok beschrieben.

User.java


package com.example.springapi.domain.object;

import lombok.Builder;
import lombok.Data;

/**
 *Nutzer
 */
@Data
@Builder
public class User {

    /**
     *Benutzeridentifikation
     */
    private String id;

    /**
     *Nutzerinformation
     */
    private String value;
}

※ Lombok @Data Die folgende Methode wird automatisch erstellt.

So was.


package com.example.springapi.domain.object;

import lombok.Builder;

/**
 *Nutzer
 */
@Builder
public class User {

    /**
     *Benutzeridentifikation
     */
    private String id;

    /**
     *Nutzerinformation
     */
    private String value;

    public String getId() {
        return this.id;
    }

    public String getValue() {
        return this.value;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof User)) return false;
        final User other = (User) o;
        if (!other.canEqual((Object) this)) return false;
        final Object this$id = this.getId();
        final Object other$id = other.getId();
        if (this$id == null ? other$id != null : !this$id.equals(other$id)) return false;
        final Object this$value = this.getValue();
        final Object other$value = other.getValue();
        if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false;
        return true;
    }

    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final Object $id = this.getId();
        result = result * PRIME + ($id == null ? 43 : $id.hashCode());
        final Object $value = this.getValue();
        result = result * PRIME + ($value == null ? 43 : $value.hashCode());
        return result;
    }

    protected boolean canEqual(Object other) {
        return other instanceof User;
    }

    public String toString() {
        return "User(id=" + this.getId() + ", value=" + this.getValue() + ")";
    }
}

@Builder Sie können die Instanzerstellung in einer Methodenkette beschreiben. Ich mag das. Sie können eine Benutzerinstanz wie diese erstellen.

String id;
String value;
User user = User.builder()
                .id(id)
                .value(value)
                .build();

Tatsächlich wird der folgende Code von Lombok generiert.

package com.example.springapi.domain.object;

import lombok.Data;

/**
 *Nutzer
 */
@Data
public class User {

    /**
     *Benutzeridentifikation
     */
    private String id;

    /**
     *Nutzerinformation
     */
    private String value;

    @java.beans.ConstructorProperties({"id", "value"})
    User(String id, String value) {
        this.id = id;
        this.value = value;
    }

    public static UserBuilder builder() {
        return new UserBuilder();
    }

    public static class UserBuilder {
        private String id;
        private String value;

        UserBuilder() {
        }

        public UserBuilder id(String id) {
            this.id = id;
            return this;
        }

        public UserBuilder value(String value) {
            this.value = value;
            return this;
        }

        public User build() {
            return new User(id, value);
        }

        public String toString() {
            return "User.UserBuilder(id=" + this.id + ", value=" + this.value + ")";
        }
    }
}

UserRepository.java Schnittstelle zwischen Domänenschicht und Infrastrukturschicht. Hier wird die Schnittstelle definiert, die Sie auf der Domänenebene verwenden möchten. Diese Schnittstelle kehrt die Abhängigkeiten zwischen der Domänenschicht und der Infrastrukturschicht um (das Prinzip der Abhängigkeitsumkehr).

UserRepository.java


package com.example.springapi.domain.repository;

import com.example.springapi.domain.object.User;

import java.util.Optional;

/**
 *Schnittstelle zur Infrastrukturschicht
 */
public interface UserRepository {

    /**
     *Benutzersuche
     *
     * @param id Benutzer-ID, nach der Sie suchen möchten
     * @wiederkehrender Benutzer
     */
    Optional<User> findById(String id);

    /**
     *Benutzer erstellt und aktualisiert
     *
     * @param user Benutzer erstellt und aktualisiert
     * @Benutzer nach dem Update zurückgeben
     */
    User save(User user);

    /**
     *User Löschung
     *
     * @param id Benutzer-ID, die Sie löschen möchten
     */
    void deleteById(String id);
}

UserService.java Eine Klasse, die unnatürliche Geschäftslogik in User.java beschreibt. Bearbeiten Sie die persistierten Benutzerinformationen über die zuvor definierte Schnittstelle. Die Implementierungsklasse von UserRepository wird mithilfe des Mechanismus DI Container of Spring gelöst. (Wenn keine Schnittstellenimplementierung vorhanden ist, tritt an dieser Stelle immer noch ein Kompilierungsfehler auf.)

UserService.java


package com.example.springapi.domain.service;

import com.example.springapi.domain.object.User;
import com.example.springapi.domain.repository.UserRepository;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 *Benutzeroperationslogik
 */
@Service
@RequiredArgsConstructor
public class UserService {

    @NonNull
    private final UserRepository userRepository;

    /**
     *Benutzersuche
     *
     * @param id Benutzer-ID, nach der Sie suchen möchten
     * @wiederkehrender Benutzer
     */
    public Optional<User> findById(String id) {
        return this.userRepository.findById(id);
    }

    /**
     *Benutzer erstellt und aktualisiert
     *
     * @param user Benutzer erstellt und aktualisiert
     * @Benutzer nach dem Update zurückgeben
     */
    public User save(User user) {
        return this.userRepository.save(user);
    }

    /**
     *User Löschung
     *
     * @param id Benutzer-ID, die Sie löschen möchten
     */
    public void deleteById(String id) {
        this.userRepository.deleteById(id);
    }
}

* DI bis zum Frühjahr

Im Frühjahr wird DI durch einen Mechanismus namens DI-Container implementiert.

Normale Java-Abhängigkeiten

A.java


public class A {
    private B b = new B();
}

Klasse A ** hängt von Klasse B ** ab.

Für Spring DI

In Spring gibt es einen Mechanismus namens DI-Container, der Instanzen automatisch in die deklarierten Variablen einfügt. Durch Hinzufügen von @Autowired wird automatisch eine Instanz erstellt und eingefügt.

A.java


@Compornent
public class A {
    @Autowired
    private B b;
}

B.java


@Compornent
public class B {
}

Der angegebene Autowired ist jedoch nur gültig **, wenn die zu injizierende Klasse (A) über den DI-Container ** erhalten wird. Das heißt, wenn Sie eine neue Klasse A wie eine normale Java-Anwendung verwenden, bleibt b null. Daher ist es bei Verwendung von Autowired erforderlich, sich im DI-Container zu registrieren. Es gibt verschiedene Möglichkeiten, sich in einem Container zu registrieren. In Spring Boot wird es jedoch grundsätzlich registriert, indem der Klasse @Compornent zugewiesen wird. Der diesmal verwendete @ Service ist ein Alias von @Compornent.

* Arten von DI bis zum Frühjahr

Der DI of Spring hat die folgende Notation. IntelliJ wird wütend, wenn ich eine Feldinjektion mache. (Aus verschiedenen Gründen wie Wiederverwendbarkeit, Unveränderlichkeit von Instanzen und explizite Abhängigkeit) Es gibt auch eine Setter-Injektion, aber ich habe sie nicht verwendet, deshalb werde ich sie weglassen.

@Compornent
public class A {
    @Autowired
    private B b;
}
@Compornent
public class A {
    private B b;
    
    @Autowired
    public A(B b) {
        this.b = b;
    }
}

* Konstruktorinjektion mit Lombok

@Autowired kann weggelassen werden, wenn nur ein Konstruktor vorhanden ist. Dies kann durch Verwendung der Annotation der Lombok-Konstruktorgeneration weggelassen werden.

@RequiredArgsConstructor
@Compornent
public class A {
    @NonNull
    private final B b;
}

Recommended Posts

Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Implementieren Sie die REST-API mit Spring Boot
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
Implementieren Sie einen einfachen Web-REST-API-Server mit Spring Boot + MySQL
Implementieren Sie GraphQL mit Spring Boot
Hallo Welt (REST API) mit Apache Camel + Spring Boot 2
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Feder mit Kotorin --4 REST API Design
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Stellen Sie mit spring boot + spring jpa eine Verbindung zur Datenbank her und führen Sie die CRUD-Operation durch
Domänengesteuerte Entwicklung mit Java und Spring Boot-Layer und Modulabteilung
[Anfänger] Versuchen Sie, die REST-API für die Todo-App mit Spring Boot zu schreiben
Das Erstellen einer REST-API mit Spring JPA-Daten mit REST und Lombok ist unglaublich einfach.
HTTPS mit Spring Boot und Let's Encrypt
Implementieren Sie CRUD mit Spring Boot + Thymeleaf + MySQL
Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf
Implementierungsmethode für Multi-Datenquelle mit Spring Boot (Mybatis und Spring Data JPA)
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Erstellen Sie einen Web-API-Server mit Spring Boot
Mit Spring Boot herunterladen
Testen von JPA-Entitäten und -Repositorys mit Spring Boot @DataJpaTest
Versuchen Sie es mit einem DI-Container mit Laravel und Spring Boot
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 2
Wechseln Sie die Umgebung mit Spring Boot application.properties und @ Profile-Annotation
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
Ein Memorandum beim Erstellen eines REST-Service mit Spring Boot
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein
Versuch, SSR Vue.js mit Spring Boot und GraalJS zu verwenden
Verbinden Sie Spring Boot und Angular typsicher mit OpenAPI Generator
Generieren Sie mit Spring Boot einen Barcode
Ich habe das Spring Boot-Einführungshandbuch [Zugriff auf Daten mit JPA] ausprobiert.
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Erstellen wir eine einfache API mit EC2 + RDS + Spring Boot ①
Bis INSERT und SELECT für Postgres mit Spring Boot und Thymianblatt
Feder mit Kotorin ―― 7. Serviceschicht
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Spring Boot beginnend mit Docker
Setzen Sie Cookies mit Spring Boot
REST-API-Test mit REST Assured
Verwenden Sie Spring JDBC mit Spring Boot
Hash beim Spring-Boot das Passwort und verwenden Sie die Mitgliederregistrierung und die Spring-Sicherheit, um die Anmeldefunktion zu implementieren.
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
API mit Spring + Vue.js verknüpfen
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
8 Dinge, die mit Spring Boot und JPA in die DB eingefügt werden müssen
Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können
Proxy- und Timeout-Einstellungen beim Aufrufen der API mit Spring Rest Template