首页 > 解决方案 > Sprint Boot Mongo Respositry 挂起第二个请求

问题描述

我在使用 SpringBoot MongoRepository 时遇到了一个奇怪的问题。

我已将问题本地化为在成功查询我的 Mongo 实例后返回对请求的响应。我有一个要查询的简单对象。一开始我可以查询并立即得到回复。之后它在成功查询 Mongo 后挂起。

这是问题发生时的日志范围

2021-04-13 21:20:03 DEBUG [http-nio-8080-exec-2] [MongoQueryCreator.java:160] Created query Query: { "trackingCode" : "PERS4J"}, Fields: {}, Sort: {}
2021-04-13 21:20:03 DEBUG [http-nio-8080-exec-2] [MongoTemplate.java:2551] find using query: { "trackingCode" : "PERS4J"} fields: Document{{}} for class: class com.gotem.domain.Link in collection: link
2021-04-13 21:20:03 DEBUG [http-nio-8080-exec-2] [SLF4JLogger.java:56] Sending command '{"find": "link", "filter": {"trackingCode": "PERS4J"}, "limit": 2, "$db": "gotem"}' with request id 9 to database gotem on connection [connectionId{localValue:2, serverValue:11}] to server localhost:27017
2021-04-13 21:20:03 DEBUG [http-nio-8080-exec-2] [SLF4JLogger.java:56] Execution of command with request id 9 completed successfully in 2.47 ms on connection [connectionId{localValue:2, serverValue:11}] to server localhost:27017

这是针对 Mongo 4.4.3 使用 Spring Boot 2.2.0.RELEASE。

我很难过:/

添加简化的设置和配置。

应用程序属性

spring.data.mongodb.uri=mongodb://localhost:27017/linkTrack

存储库

@Repository
public interface LinkRepository extends MongoRepository<Link, Long> {
    Link findOneByTrackingCode(String trackingCode); 
}

查询控制器

public class LinkController {
    private static final Logger LOG = LoggerFactory.getLogger(LinkController.class);
    @Autowired
    private LinkRepository linkRepository;

    @RequestMapping(value = "/retrieve/{trackingCode}", method = RequestMethod.GET)
    public Link findOneByTrackingCode(@PathVariable String trackingCode) {
        Link link = linkRepository.findOneByTrackingCode(trackingCode);
        LOG.debug("Link: " + link);
        return link;
    }
}

目的

@Document
public class Link implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private String id;
    private String trackingCode;
    
    public Link() {
        this.trackingCode = "123456"; // THIS WAS THE ISSUE :(
    }

    private getTrackingCode(){
        return this.trackingCode
    };
  
}

标签: mongodbspring-boot

解决方案


出色地。废话。我在链接对象中有一个构造函数,它将生成的 id 添加到 trackingCode 字段中,一旦删除它就可以按预期工作。

我仍然不知道为什么它在重新启动服务后对第一个请求起作用并且只是在之后才挂起。


推荐阅读