如何使用Neo4J OGM过滤自定义实体类型的类字段?

时间:2019-03-27 13:12:37

标签: scala neo4j neo4j-ogm

我正在使用自定义实体类型:

@NodeEntity
class SutStateEntity(state: SutState) extends Entity {

  def this() = this(null)

  @Convert(classOf[SutStateConverter])
  val sutState = state
}

现在,我想获得一个与类字段sutState相匹配的实体。 请注意,类型SutState必须由我的自定义转换器SutStateConverter转换,因为它不是Neo4J OGM支持的原始类型。

这是我用来过滤匹配实体的代码:

val filter = new Filter("sutState", ComparisonOperator.EQUALS, sutState)
val first = session.loadAll(classOf[SutStateEntity], filter).stream().findFirst()

但是,此代码导致以下异常:

Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: No serializer found for class de.retest.recheck.ui.descriptors.StringAttribute$1 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.HashMap["sutState_0"]->de.retest.recheck.ui.descriptors.SutState["rootElements"]->java.util.ArrayList[0]->de.retest.recheck.ui.descriptors.RootElement["identifyingAttributes"]->de.retest.recheck.ui.descriptors.IdentifyingAttributes["attributes"]->java.util.ArrayList[0]->de.retest.recheck.ui.descriptors.StringAttribute["type"])

StringAttribute是SutState存储的实例的字段的类型。 它具有SutState XML批注,并且SutStateConverter能够将其编组和解组而不会出现问题(已通过自定义单元测试进行了验证)。

Neo4J OGM是否不将转换器用于我的过滤器? 如何为类字段sutState指定过滤器?

这是我的自定义转换器的代码:

class SutStateConverter extends AttributeConverter[SutState, String] {
  def toGraphProperty(value: SutState): String = XmlTransformerUtil.getXmlTransformer.toXML(value)
  def toEntityAttribute(value: String): SutState =
    XmlTransformerUtil.getXmlTransformer.fromXML[SutState](new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8)))
}

XmlTransformerUtil.getXmlTransformer.toXML和XmlTransformerUtil.getXmlTransformer.fromXML封送SutState和从XML封送SutState。 该课程已经在单元测试中进行了测试,应该可以正常工作。

1 个答案:

答案 0 :(得分:0)

您的假设是正确的:Neo4j-OGM不使用转换器。 这是由于以下事实:通常,过滤器未绑定到特殊的实体类,但转换器绑定到了实体类的属性。 在loadAll调用中将过滤器应用于特定实体时,这会发现属性是否绑定了转换器。

最简单的方法是手动创建转换器的实例,并将toGraphProperty方法应用于您提供的过滤器值。

(您可能需要)更清洁的方法是,如果需要更频繁地为该属性创建过滤器,则可以通过类似Filter的类来扩展SutStateFilter类,使其在幕后起作用。 / p>