首页 > 解决方案 > 弹性搜索 JPA 存储库不提供 findAll 和 findBy... 方法的结果

问题描述

我在弹性搜索中使用 spring-data-elasticsearch 进行 crud 操作。

只能将数据保存到弹性搜索并且 findById 方法有效。

findAll 和 findBy... 方法不起作用,并给出空响应。

我尝试在 POM 中使用其他版本

经过一些调试,我发现 findById 方法实际上是在发送 HTTP GET 请求,而 findAll/findBy... 是在发送 HTTP POST 请求。

在这两种情况下,GET/POST 弹性搜索都返回带有数据的响应,我在wireshark 上验证了这些数据。在本地运行。我可以在wireshark上看到响应findAll方法调用的命中,但我们没有通过存储库接收到命中。

如果我可以看到数据的响应,这意味着弹性搜索和查询创建很好,但问题在于在 JPA 中使用数据。JPA实际上是在处理消费的事情。

我不知道如何进一步调试。

数据模型类


    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @Document(indexName = "data", type = "_doc")
    public class Data {

        @Id
        private String id;

        private String title;

        @Field(type = FieldType.Text)
        private Status status;

        private String description;
    }

存储库类


    @Repository
    public interface DataRepository extends ElasticsearchRepository<Data,String> {
        default <S extends Data> S saveWithKafkaPush(S s){
            S s1 = save(s);
            KafkaProducer.produceMessage(s);
            return s1;
        }

        default <S extends Data> Iterable<S> saveAllWithKafkaPush(Iterable<S> iterable){
            Iterable<S> s = saveAll(iterable);
            return s;
        }

        Optional<Data> findByStatus(Status status);
    }

状态枚举


    public enum Status {
        UNTITLED,
        DRAFT,
        REVIEW,
        APPROVED,
        PUBLISHED;
    }

服务等级


    @Autowired
    private DataRepository dataRepository;

    public Data findByStatus(Status status){
        Optional<Data> data = dataRepository.findByStatus(status);
        return data.isPresent()? data.get() : null;
    }

    public Data save(Data data){
        return dataRepository.save(data);
    }

    public void deleteData(String id){
        dataRepository.deleteById(id);
    }

findByStatus 方法不起作用,但保存和 deleteData 工作正常。

标签: javaspring-bootelasticsearchspring-data-jpaspring-data-elasticsearch

解决方案


推荐阅读