【发布时间】:2021-04-13 21:33:54
【问题描述】:
我在使用 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。
我被难住了:/
添加简化的设置和配置。
application.properties
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
};
}
【问题讨论】:
-
挂起到底是什么意思?是永久封杀吗?你是如何触发数据库查询的?能把所有相关的代码和配置sn-ps都加进去吗?
-
我看到了上面的执行,然后它再也没有做任何其他事情。存储库查找之后的下一行是用于输出对象的调试行。启动后的第一个请求将在它停止后返回它。添加上面的配置详细信息。
-
我看到存储库定义
LinkRepository extends MongoRepository<Link, Long>,需要是LinkRepository extends MongoRepository<Link, String>。此外,请尝试在您的 find 方法中使用@Query注释来指定您将参数传递给查询。
标签: mongodb spring-boot