2016-05-03 39 views
13

Rest EndpointJTA pojemnik udało transakcja wycofywania nie działa dla punktu końcowego jaxrs

<jaxrs:server id="jaxrs" 
       address="http://127.0.0.1:8080/jaxrs"> 

    <jaxrs:serviceBeans> 
     <ref component-id="service1" /> 
     ... 
     ... 
     <ref component-id="serviceX" /> 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
     <ref component-id="runtimeExceptionMapper" /> 
    </jaxrs:providers> 
</jaxrs:server> 

Route

<route id="secureBridgeRoute"> 
    <from uri="jetty:https://0.0.0.0:443/jaxrs?sslContextParametersRef=sslContextParameters&amp;matchOnUriPrefix=true&amp;minThreads=8&amp;maxThreads=16" /> 
    <transacted ref="JTA_TRANSACTION" /> 
    <to uri="jetty:http://127.0.0.1:8080/jaxrs?bridgeEndpoint=true&amp;throwExceptionOnFailure=true" /> 
</route> 

DAO

<bean id="dao1" class="com.example.Dao1" activation="eager"> 
    <jpa:context unitname="PU" property="entityManager" type="TRANSACTION" /> 
</bean> 

usługi fasola

<bean id="service1" class="com.example.Service1" activation="eager"> 
    <property name="dao1" ref="dao1" /> 
    <property name="dao2" ref="dao2" /> 
    <tx:transaction method="*" value="Required" /> 
</bean> 

metoda fasola usługi pseudokod

boolean create(entity1, entity2) { 
    dao1.persist(entity1); 
    dao2.persist(entity2); 
} 

Kiedy dao2 ustąpią, nie powiodła się, że transakcja nie dostać wycofana. Entity1 zostaje wstawiony do DB.

Dodatkowe informacje definicja

1) TransactionManager

<reference id="platformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" /> 
<bean id="JTA_TRANSACTION" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> 
    <property name="transactionManager" ref="platformTransactionManager" /> 
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" /> 
</bean> 

2) Moje trwałe urządzenie jest typu JTA i hibernacji jako dostawca.

3) Posiadam ExceptionMapper, która, gdy się na nią patrzę, pokazuje, że transakcja rzeczywiście jest oznaczona do wycofania.

4) Fasole usługowe nie są rozdzielane na inny pakiet.

5) Autokonfiguracja w trybie hibernacji NIE jest prawdą.

Zastanawiam się, jeżeli:

  1. CXF OutFaultInterceptor został „zjedzony” wyjątek, który ma być złapany przez pojemnik do wycofania transakcji. W rezultacie wycofanie nie wystąpiło.

  2. Menedżer encji musi być tą samą instancją współużytkowaną wśród wszystkich obiektów DAO, aby możliwe było wycofanie zmian.

  3. Czy to możliwe, że muszę oddzielić usługę na inny pakiet?

Doceń, jeśli ktoś mógłby poinformować mnie o prawidłowym podejściu do obsługi transakcji w warstwie usług dla punktu końcowego cxf jaxrs.

Odpowiedz