Hibernate Search 6@ProjectionConstructor不工作

ubby3x7f  于 2022-10-23  发布在  Spring
关注(0)|答案(2)|浏览(137)

在集成我们现有的应用程序之前,我正在试验HibernateSearch 6.2.0.Alpha1的投影功能。
我已经使用JHIPSTER sample project创建了一个Spring-Boot项目。并在POM.XML和APPLICATION*.yml中添加了休眠搜索依赖项和配置。使用JHipster是因为它帮助我处理样板代码和虚假数据。
我已经使用-parametersjandex配置了pom.xml。应用程序成功运行并将数据加载到数据库中。我能够使用我们根据文档编写的实用程序来创建质量索引。
然而,当尝试使用投影搜索数据时,我们收到错误Exception in searchWithProjection() with cause = 'NULL' and exception = 'HSEARCH700112: Invalid object class for projection: com.sample.shop.service.projections.dto.Address. Make sure that this class is mapped correctly, either through annotations (@ProjectionConstructor) or programmatic mapping. If it is, make sure the class is included in a Jandex index made available to Hibernate Search.'。如果我们在没有投影的情况下进行搜索,同样的查询/逻辑也可以很好地工作。
前男友。如果您查看上面链接的存储库中的文件AddressResource.java & AddressService.java,您可以找到两个分别用于投影和非投影的实现。虽然没有投影的项目运行得很好,但有项目的项目却犯了错误。
我觉得这可能是一些配置问题,但我自己也搞不清楚。感谢您在配置/代码方法方面的帮助。
以下机票我已经看过了,敬请告知:
1.Hibernate Search 6 combine projections not working
1.Hibernate搜索中的单一返回类型

xnifntxz

xnifntxz1#

谢谢你的复制者。这是一个错误:https://hibernate.atlassian.net/browse/HSEARCH-4724
我在这里建议了一个解决方法:https://github.com/anothergoodguy/spring-data-hibernate-search/pull/1
简而言之:

  • 将此类添加到您的应用程序中:
package com.sample.shop.config;

import java.net.URISyntaxException;
import java.nio.file.Path;
import org.hibernate.search.mapper.orm.mapping.HibernateOrmMappingConfigurationContext;
import org.hibernate.search.mapper.orm.mapping.HibernateOrmSearchMappingConfigurer;
import org.hibernate.search.util.common.jar.impl.JandexUtils;
import org.springframework.stereotype.Component;

@Component("searchMappingConfigurer")
public class HibernateSearchMappingConfigurer implements HibernateOrmSearchMappingConfigurer {

    @Override
    public void configure(HibernateOrmMappingConfigurationContext context) {
        // Workaround for https://hibernate.atlassian.net/browse/HSEARCH-4724
        // => Hibernate Search doesn't seem to find the Jandex index in the fat JAR.
        try {
            var classesUri = getClass().getProtectionDomain().getCodeSource().getLocation().toURI();
            var ssp = classesUri.getSchemeSpecificPart();
            var jarpath = Path.of(ssp.substring(ssp.indexOf(":") + 1, ssp.indexOf("!")));
            context.annotationMapping().add(JandexUtils.readIndex(jarpath).get());
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}
  • 在您的配置中引用:
jpa:
    properties:
      hibernate.search.mapping.configurer: bean:searchMappingConfigurer

然后,瞧。
注意:这只是一种解决办法,并且依赖于随时可能崩溃的内部代码。但是,好吧,至少它是有效的,所以在错误被修复之前它是好的。

vh0rcniy

vh0rcniy2#

以下是运行该应用程序的说明:
所有需要的生态系统,如Elasticearch、kibana和MySQL都添加在src/main/docker/eco.yml下的eco.yml文件中。请使用以下命令启动生态系统docker-compose -f src/main/docker/eco.yml up -d && docker-compose -f src/main/docker/eco.yml logs -f
在不同的终端选项卡/窗口上,使用以下命令./mvnw clean package -Pprod,api-docs -Dskip.Tests -Dmaven.test.skip=true构建应用程序以运行应用程序运行以下命令java -jar target/shop-app-0.0.1-SNAPSHOT.jar
一旦应用程序启动,它将显示它正在侦听http://localhost:8080(http://localhost:8080)。请在浏览器上打开相同的URL,并使用默认管理员用户:admin和密码:admin登录。然后请从管理员菜单和API菜单项导航到SWAGGER。
我们需要从相同的swagger窗口对已经从swagger加载的虚假数据编制大量索引:通过在资源ElasticSearch大规模索引API上执行**/api/mount/index上的帖子
请进入
地址-资源**:
1.不带投影的请求使用查询字符串aa访问/api/_search/addresses-这将导致成功
1.带有投影的请求使用相同的查询字符串aa访问/_search/addresses/projection-这将导致失败

相关问题