Spring应用程序返回空JSON

时间:2018-08-20 08:00:42

标签: java spring eclipse spring-boot spring-tool-suite

我已经开始阅读“学习Spring Boot 2.0-第二版:简化基于微服务和反应式编程的快速闪电应用程序的开发”,并且遇到了第一个示例程序中的麻烦。

当我在http://localhost:8080/chapters上执行GET时,它将返回:

[
    {},
    {},
    {}
]

代替:

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

这是我的代码(减去进口):

@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();
    }

}

我的代码有问题吗?

其他信息

正如下面的评论所述,我有了一些发展。以前,我只尝试在IDE中运行它。我使用gradle构建项目,进行./gradlew clean构建,并使用java -jar build / libs / learning-spring-boot-0.0.1-SNAPSHOT.jar从我的终端运行它,并且得到了正确的响应。适用于失眠,邮递员,浏览器和curl。这使我可以继续工作,但是我很想为我的IDE解决这个问题。我正在使用适用于Eclipse的Spring工具套件。

我注意到的一件事是,当我在STS中启动服务器时,控制台输出以以下形式结束:

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
    com.greglturnquist.learningspringboot.learningspringboot.Chapter@c56c194
    com.greglturnquist.learningspringboot.learningspringboot.Chapter@795759ac
    com.greglturnquist.learningspringboot.learningspringboot.Chapter@76e125f2

但是在终端中运行时,我可以看到书名:

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!)

5 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,对我来说,要确保我的IDE已启用Lombok批注处理(我正在使用IntelliJ Ultimate)。启用此功能并重新启动我的应用程序时,我开始看到预期的数据,而不是空的JSON数组。

答案 1 :(得分:5)

this页所述,并适合您的用例:

  

答案是肯定的。 Flux<Chapter>代表Chapters的流。但,   默认情况下,它将产生一个JSON数组,因为如果   单个JSON对象发送到浏览器,则不会   整个有效JSON文档。浏览器客户端无法使用   流,而不是使用服务器发送事件或WebSocket。

     

但是,非浏览器客户端可以通过设置来请求JSON流   接受标头到application/stream+json,响应将是   类似于服务器发送事件的JSON流,但没有额外的   格式:

因此,在您的情况下,您需要在浏览器中请求结果。如果将适当的accept header添加到application/stream+json,您将获得所需的输出。

答案 2 :(得分:0)

更改您的以下代码

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

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

因为它将内部将您的列表转换为JSON。

答案 3 :(得分:0)

可能是龙目岛依赖问题。尝试编写setter和getter方法而不是lombok。

答案 4 :(得分:0)

就我而言,之前的答案/提示都没有解决它。

解决方案是在我的实体中实施:

  • @Override public int hashCode()
  • @Override public boolean equals(Object)