【问题标题】:Error while indexing in Hibernate Search - Could not get property value在 Hibernate Search 中编制索引时出错 - 无法获取属性值
【发布时间】:2020-03-03 14:35:33
【问题描述】:

我正在使用带有 Spring Boot 的 Hibernate Search 来创建可搜索的 rest api。尝试发布“Training”实例时,我收到以下堆栈跟踪。这两个对我来说都不是很有见地,这就是我寻求帮助的原因。

堆栈跟踪: https://pastebin.com/pmurg1N3

在我看来,它正在尝试索引一个空实体!?怎么会这样?有什么想法吗?

实体:

@Entity @Getter @Setter @NoArgsConstructor
@ToString(onlyExplicitlyIncluded = true)
@Audited @Indexed(index = "Training")
@AnalyzerDef(name = "ngram",
    tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class ),
    filters = {
      @TokenFilterDef(factory = StandardFilterFactory.class),
      @TokenFilterDef(factory = LowerCaseFilterFactory.class),
      @TokenFilterDef(factory = StopFilterFactory.class),
      @TokenFilterDef(factory = NGramFilterFactory.class,
        params = {
          @Parameter(name = "minGramSize", value = "2"),
        } 
      )
    }
)
@Analyzer(definition = "ngram")
public class Training implements BaseEntity<Long>, OwnedEntity {

    @Id
    @GeneratedValue
    @ToString.Include
    private Long id;

    @NotNull
    @RestResourceMapper(context = RestResourceContext.IDENTITY, path = "/companies/{id}")
    @JsonProperty(access = Access.WRITE_ONLY)
    @JsonDeserialize(using = RestResourceURLSerializer.class)
    private Long owner;

    @NotNull
    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
    private String name;

    @Column(length = 10000)
    private String goals;

    @Column(length = 10000)
    private String description;

    @Enumerated(EnumType.STRING)
    @Field(index = Index.YES, store = Store.YES, analyze = Analyze.NO, bridge=@FieldBridge(impl=EnumBridge.class))
    private Audience audience;

    @Enumerated(EnumType.STRING)
    @Field(index = Index.YES, store = Store.YES, analyze = Analyze.NO, bridge=@FieldBridge(impl=EnumBridge.class))
    private Level level;

    @ManyToMany
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    @NotNull @Size(min = 1)
    @IndexedEmbedded
    private Set<ProductVersion> versions;

    @NotNull
    private Boolean enabled = false;

    @NotNull
    @Min(1)
    @IndexedEmbedded
    @Field(index = Index.YES, store = Store.YES, analyze = Analyze.NO)
    @NumericField
    private Integer maxStudents;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    private Agenda agenda;

    @NotNull
    @Min(1)
    @Field(index = Index.YES, store = Store.YES, analyze = Analyze.NO)
    @NumericField
    private Integer durationDays;

    @IndexedEmbedded
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    @ManyToMany(cascade = CascadeType.PERSIST)
    private Set<Tag> tags = new HashSet<>();

【问题讨论】:

    标签: spring-boot hibernate-search


    【解决方案1】:

    我会说您的 versions 集合或您的 tags 集合包含 null 对象,这通常不是我们在 Hibernate ORM 关联中所期望的,显然也不是 Hibernate Search 所期望的。

    你能在调试模式下检查吗?

    【讨论】:

    • 确实是这样,而且一开始就不应该发生。堆栈跟踪中的哪一行是您的指标?这样我下次就能找到自己了。
    • 好吧,我知道 Hibernate Search 代码库,所以我作弊了,但这个帮助了我:Caused by: java.lang.IllegalStateException: Could not get property value 和下面:at org.hibernate.search.util.impl.ReflectionHelper.getMemberValue(ReflectionHelper.java:94)。因此 NPE 在获取成员的值时发生,这意味着源对象为空,正如您正确推断的那样。在下面,at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.buildDocumentFieldsForEmbeddedObjects 告诉我们这是在处理 @IndexedEmbedded 时发生的。
    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多