Откройте для себя методы без @Transaction?

Я борюсь с проверкой, которую я хотел бы реализовать. Я хотел бы убедиться, что все Методы из Службы, которые начинаются с обновления, должны иметь аннотацию @Transactional. До сих пор я создал концепцию, которая дает мне методы из моего класса обслуживания, которые начинаются с update (например, updateInvoice). Но я понятия не имею, как создать ограничение, которое выбирает методы, у которых нет аннотации @Transaction.

2 ответа

Решение

Я бы рекомендовал определить некоторые концепции, представляющие ваши ключевые элементы, чтобы определить ограничения на них, т.е.

Ваши услуги:

<concept id="service:ServiceClass">
  <description>Adds a label "Service" to every class annotated by "@com.mycompany.services.Service"</description>
  <cypher><![CDATA[
  MATCH
    (service:Type:Class)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(serviceAnnotationType)
  SET
    service:Service
  WHERE
    serviceAnnotationType.fqn = "com.mycompany.services.Service"
  RETURN
    service   
  ]]>
  </cypher>
</concept>

Ваши транзакции методы:

<concept id="service:TransactMethod">
  <description>Adds a label "Transact" to every method annotated by "@com.mycompany.services.Transact"</description>
  <cypher><![CDATA[
  MATCH
    (method:Method)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(transactAnnotationType)
  SET
    method:Transact
  WHERE
    transactAnnotationType.fqn = "com.mycompany.services.Transact"
  RETURN
    method   
  ]]>
  </cypher>
</concept>

Ваше ограничение:

<constraint id="service:AllUpdateMethodsMustBeTransacted">
  <requiresConcept refId="service:ServiceClass" />
  <requiresConcept refId="service:TransactMethod" />
  <description>All update methods must be transacted</description>
  <cypher><![CDATA[
  MATCH
    (service:Service:Class)-[:DECLARES]->(updateMethod:Method)
  WHERE
    updateMethod.name =~ "update.*" // even this could be extracted to a concept
    and not updateMethod:Transact
  RETURN
    updateMethod
  ]]>
  </cypher>
</constraint >

Этот подход имеет несколько преимуществ:

  • Теперь вы получаете больше правил, но каждое из них гораздо лучше читается (особенно консистент), потому что вы используете термины, которые вы определили для своего дизайна
  • Вполне вероятно, что вам понадобятся понятия "Сервис" и "Транзакция" и для других ограничений - теперь просто используйте метки
  • Если вы создаете сайт Maven, вы получаете отчет обо всех концепциях вашего дизайна (то есть, какие реализации сервиса существуют в настоящее время)

Кажется, работает следующее:

match
   (aType:Type:Class)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(anAnnotationType:Type),
   (aType:Type)-[:DECLARES]->(aMethod:Method)
optional match
   (aMethod)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(tType:Type)
with anAnnotationType, aMethod, tType
where
    anAnnotationType.fqn = "com.mycompany.services.Service" 
    and aMethod.name =~ "update.*"
    and ((tType is null) or not (tType.fqn = "com.mycompany.services.Transact"))
return
    aMethod.name, tType
Другие вопросы по тегам