wake-up-neo.net

Spring-Anwendung, die leeres JSON zurückgibt

Ich habe angefangen zu lesen „Learning Frühlings-Boot 2.0 - Second Edition: Vereinfachen Sie die Entwicklung von blitzschnellen Anwendungen auf Basis von Microservice und reaktiver Programmierung“ und haben Probleme mit einem der ersten Beispielprogrammen.

Wenn ich ein GET für http://localhost:8080/chapters mache, wird Folgendes zurückgegeben:

[
    {},
    {},
    {}
]

anstatt:

[
    {"id": 1,
     "name": "Quick Start with Java"},
    {"id":,
     "name": "Reactive Web with Spring Boot"},
    {"id": 3,
     "name": ... and more!"}
]

Das ist mein Code (minus Importe):

@Data
@Document
public class Chapter {

    @Id
    private String id;
    private String name;

    public Chapter(String name) {
        this.name = name;
    }
}


public interface ChapterRepository extends ReactiveCrudRepository<Chapter, String>{
}

@Configuration
public class LoadDatabase {

@Bean
CommandLineRunner init(ChapterRepository repository) {
    return args -> {
        Flux.just(
                new Chapter("Quick Start with Java"),
                new Chapter("Reactive Web with Spring Boot"),
                new Chapter("... and more!"))
        .flatMap(repository::save)
        .subscribe(System.out::println);
        };
    }
}

@RestController
public class ChapterController {

    private final ChapterRepository repository;

    public ChapterController(ChapterRepository repository) {
        this.repository = repository;
    }

    @GetMapping("/chapters")
    public Flux<Chapter> listing() {
        return repository.findAll();
    }

}

Stimmt etwas mit meinem Code nicht?

Zusätzliche Information

Wie in einem Kommentar unten angegeben, habe ich eine gewisse Entwicklung gehabt. Bisher hatte ich nur versucht, dies in meiner IDE auszuführen. Ich lief es gerade von meinem Terminal mit Java -jar bauen/libs/Lernen-Feder-boot-0.0.1-SNAPSHOT.jar und ich bekomme die richtige Antwort. Funktioniert für Insomnia, Postman, Browser und Curl. Dies ermöglicht es mir, mit meiner Arbeit fortzufahren, aber ich würde gerne eine Lösung für meine IDE finden. Ich verwende die Spring Tool Suite für Eclipse.

Eines ist mir aufgefallen: Wenn ich den Server in STS starte, wird die Konsolenausgabe folgendermaßen beendet:

2018-09-09 09:54:50.646  INFO 12073 --- [ntLoopGroup-2-3] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:4, serverValue:31}] to localhost:27017
2018-09-09 09:54:50.647  INFO 12073 --- [ntLoopGroup-2-2] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:3, serverValue:30}] to localhost:27017
2018-09-09 09:54:50.649  INFO 12073 --- [ntLoopGroup-2-4] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:5, serverValue:32}] to localhost:27017
    c[email protected]c56c194
    c[email protected]795759ac
    c[email protected]76e125f2

aber wenn ich im Terminal laufe, kann ich die Buchnamen sehen:

2018-09-09 09:52:42.768  INFO 12058 --- [ntLoopGroup-2-2] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:3, serverValue:25}] to localhost:27017
2018-09-09 09:52:42.789  INFO 12058 --- [ntLoopGroup-2-3] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:4, serverValue:26}] to localhost:27017
2018-09-09 09:52:42.791  INFO 12058 --- [ntLoopGroup-2-4] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:5, serverValue:27}] to localhost:27017
Chapter(id=5b94df5ac0b4b02f1af43f43, name=Quick Start with Java)
Chapter(id=5b94df5ac0b4b02f1af43f44, name=Reactive Web with Spring Boot)
Chapter(id=5b94df5ac0b4b02f1af43f45, name=...and more!)
7
runnerpaul

Ich hatte das gleiche Problem, und ich füge hinzu, um sicherzustellen, dass in meinem IDE die Lombok-Anmerkungsverarbeitung aktiviert ist (ich verwende IntelliJ Ultimate). Beim Aktivieren und Neustarten meiner App wurden Daten wie erwartet und keine leeren JSON-Arrays angezeigt.

5
Michael Dally

Wie auf this Seite angegeben und an Ihren Anwendungsfall angepasst:

Und die Antwort lautet Ja. Flux<Chapter> repräsentiert einen Stream von Chapters. Standardmäßig wird jedoch ein JSON-Array erstellt, da es kein gültiges JSON-Dokument als Ganzes darstellt, wenn ein Stream einzelner JSON-Objekte an den Browser gesendet wird. Ein Browser-Client kann keinen anderen Stream als Server-Sent-Events oder WebSocket verwenden.

Nicht-Browser-Clients können jedoch einen JSON-Stream anfordern, indem Sie den Accept-Header auf application/stream+json setzen. Die Antwort ist ein JSON-Stream, der Server-Sent-Events ähnelt, jedoch ohne zusätzliche Formatierung:

In Ihrem Fall fordern Sie das Ergebnis also in Ihrem Browser an. Wenn Sie den entsprechenden accept header zu application/stream+json hinzufügen, erhalten Sie die gewünschte Ausgabe.

5
mrkernelpanic

Ändern Sie Ihren unten stehenden Code

@GetMapping("/chapters")
public Flux<Chapter> listing() {
    return repository.findAll();
}

zu

@GetMapping("/chapters")
public @ResponseBody Flux<Chapter> listing() {
    return repository.findAll();
}

Da es Ihre Liste intern in JSON konvertiert.

0

Könnte ein Problem mit der Lombok-Abhängigkeit sein. Versuchen Sie, Setter- und Getter-Methoden anstelle von Lombok zu schreiben.

0
Venkky