2016-06-09 1 views
1

Я создал расширение Neo4j. Он содержит мои собственные TransactionEventHandler. Иногда выполнение его метода beforeCommit() приводит к UniquePropertyConstraintViolationKernelException. Все нормально. Но на стороне сервера я получаю ResultProcessingException. Это исключение выглядит слишком обобщенным. Я думаю, это может быть брошено по многим причинам не только в случае нарушения ограничений. Итак, мой вопрос заключается в том, как я должен обрабатывать нарушения ограничений на стороне сервера? Я использую SDN4.Как правильно обрабатывать нарушение уникального ограничения в SDN4?

Edit 1: Все Neo4j-ogm- * версии обновлены до 2.0.3

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.neo4j</groupId> 
      <artifactId>neo4j-ogm-core</artifactId> 
      <version>2.0.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.neo4j</groupId> 
      <artifactId>neo4j-ogm-http-driver</artifactId> 
      <version>2.0.3</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

enter image description here

ответ

2

Если вы на SDN 4.0, это известная проблема, что исключение слишком велико.

В SDN 4.1.1 мы представили исключение CypherException, которое обертывает базовый код ошибки Neo4j, и это равномерно распределяется по всем трем драйверам при выполнении Cypher. Если вы используете SDN 4.1.1, и вы не получите это исключение, возможно, мы пропустили какую-то часть кода - пожалуйста, raise a github issue с подробностями о том, как воспроизвести это.

Обновление: Понял, что SDN 4.1.1 зависит от OGM 2.0.1, который производит исключение CypherException, но не обертывает причину. Пожалуйста, переопределите neo4j-ogm-core и любые версии драйверов до 2.0.3. CypherException.getCode() должен производить Neo.ClientError.Schema.ConstraintViolation. Обратите внимание: если вы используете встроенный драйвер, основное исключение будет завершено. Но через HTTP-драйвер эта информация не получена, и вы получите следующее только в CypherException:

code: Neo.ClientError.Schema.ConstraintViolation 
description: Node 7 already exists with label User and property "name"=[luanne] 
+0

Да, это правда. После обновления SDN до 4.1.1 я получаю CypherException. Описание содержит следующее сообщение: «TransactionFailureException: ошибка выполнения Cypher Transaction.CouldNotCommit». Но для меня все еще неясно, как я могу понять тип проблемы. Внутри TransactionEventHandler.beforeCommit() я получаю 'ConstraintViolationException' с четким описанием. Но на стороне сервера я ничего не вижу об этом. –

+0

Отредактировано решение – Luanne

+0

Спасибо! Но такая конфигурация вызывает еще одну проблему. Я заменил версии «neo4j-ogm-core» и «neo4j-ogm-http-driver», как вы сказали. И когда я пытаюсь вызвать 'neo4jOperations.query (« CREATE CONSTRAINT ON (n: Event) ASSERT n.uniqueId IS UNIQUE », Collections.emptyMap());' Я получаю 'NoSuchMethodError' с описанием следующим образом:" HttpClientBuilder.setSSLContext (SSLContext)». Он работал раньше. –