Как отфильтровать для поля класса пользовательского типа сущности с Neo4J OGM? - PullRequest
0 голосов
/ 27 марта 2019

Я использую пользовательский тип объекта:

@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. Он похож на XML-аннотации SutState, и 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 производят маршал и демаршал SutStates в и из XML. Класс был протестирован в модульном тесте и должен работать.

1 Ответ

0 голосов
/ 05 апреля 2019

Ваше предположение верно: Neo4j-OGM не использует конвертер.Это связано с тем, что фильтр в целом не привязан к специальному классу сущностей, а конвертер связан со свойством класса сущностей.Нет никакой магии при применении фильтра к определенной сущности в вызове loadAll, который затем проверял бы, имеет ли свойство привязанный к нему конвертер.

Самый простой способ - создать экземпляр вашего конвертера вручнуюи примените метод toGraphProperty к предоставленному значению фильтра.

(возможно) более чистый подход может заключаться в расширении класса Filter чем-то вроде SutStateFilter, который выполняет работу под капотом, если вынужно чаще создавать фильтр для этого свойства.

...