[ 
https://issues.apache.org/jira/browse/DELTASPIKE-420?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13918173#comment-13918173
 ] 

Harald Wellmann commented on DELTASPIKE-420:
--------------------------------------------

My application which uses 0.6-SNAPSHOT just broke due to today's changes, and 
I'm left with a couple of issues even after introducing the 
BeanManagedUserTransactionStrategy:

* For a stateless session bean injecting a repository bean, I'm getting this 
exception on WildFly 8.0.0.Final:

{noformat}
Caused by: javax.naming.NamingException: JBAS014237: Only session and 
message-driven beans with bean-managed transaction demarcation are allowed to 
access UserTransaction
        at 
org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:142)
 ~[na:na]
        at 
org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:81)
 ~[na:na]
        at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:202) 
~[na:na]
        at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:179) 
~[na:na]
        at 
org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:235)
 ~[na:na]
        at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:188) 
~[na:na]
        at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:184) 
~[na:na]
        at javax.naming.InitialContext.lookup(InitialContext.java:411) 
~[na:1.7.0_51]
        at javax.naming.InitialContext.lookup(InitialContext.java:411) 
~[na:1.7.0_51]
        at 
org.jboss.as.weld.services.bootstrap.WeldResourceInjectionServices.resolveResource(WeldResourceInjectionServices.java:185)
 ~[na:na]
        at 
org.jboss.as.weld.services.bootstrap.WeldResourceInjectionServices$1.createResource(WeldResourceInjectionServices.java:135)
 ~[na:na]
        at 
org.jboss.weld.injection.AbstractResourceInjection.getResourceReference(AbstractResourceInjection.java:44)
 ~[na:na]
        at 
org.jboss.weld.injection.AbstractResourceInjection.injectResourceReference(AbstractResourceInjection.java:53)
 ~[na:na]
        at org.jboss.weld.util.Beans.injectEEFields(Beans.java:331) ~[na:na]
        at 
org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:59)
 ~[na:na]
        at 
org.jboss.weld.injection.producer.DefaultInjector$1.proceed(DefaultInjector.java:66)
 ~[na:na]
        at 
org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) 
~[na:na]
        at 
org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64)
 ~[na:na]
        at 
org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:90)
 ~[na:na]
        at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:150) ~[na:na]
        at 
org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
 ~[na:na]
        at 
org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:733) 
~[na:na]
        at 
org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:789) 
~[na:na]
        at 
org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
 ~[na:na]
{noformat}

As a workaround, I created a local copy of BeanManagedUserTransactionStrategy 
as global alternative, deleting the {{@Resource}} annotation from the 
{{UserTransaction}} field.

* For  {{@ApplicationScoped @Transactional}} beans injecting a repository, I'm 
getting this exception:

{noformat}
Caused by: java.lang.IllegalStateException: UserTransaction is not available 
within the scope of a bean or method annotated with @Transactional and a 
Transactional.TxType other than NOT_SUPPORTED or NEVER
        at 
org.jboss.tm.usertx.client.ServerVMClientUserTransaction.testAvailability(ServerVMClientUserTransaction.java:232)
        at 
org.jboss.tm.usertx.client.ServerVMClientUserTransaction.getStatus(ServerVMClientUserTransaction.java:196)
        at 
MyTransactionStrategy$UserTransactionAdapter.getTransactionStatus(MyTransactionStrategy.java:331)
        at 
MyTransactionStrategy$UserTransactionAdapter.isActive(MyTransactionStrategy.java:307)
        at 
org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.rollbackAllTransactions(ResourceLocalTransactionStrategy.java:275)
        at 
org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.execute(ResourceLocalTransactionStrategy.java:153)
        at 
org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeTransactional(TransactionalQueryRunner.java:72)
        at 
org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeQuery(TransactionalQueryRunner.java:54)
        at 
org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:80)
        ... 77 more

        at 
org.ops4j.pax.exam.servlet.TestRunnerServlet.runSuite(TestRunnerServlet.java:110)
        at 
org.ops4j.pax.exam.servlet.TestRunnerServlet.doGet(TestRunnerServlet.java:76)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
        at 
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
        at 
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
        at 
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
        at 
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
        at 
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113)
        at 
io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52)
        at 
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
        at 
io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61)
        at 
io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
        at 
io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
        at 
org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
        at 
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
        at 
io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:101)
        at 
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240)
        at 
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227)
        at 
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73)
        at 
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168)
        at 
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
{noformat}

I had to convert these beans to stateless session beans - that doesn't hurt too 
much for the time being, but I'd prefer to have repositories work out of the 
box even in this case. If there's no easy way to achieve this, then at least 
this restriction should be documented.

> Transactional repositories
> --------------------------
>
>                 Key: DELTASPIKE-420
>                 URL: https://issues.apache.org/jira/browse/DELTASPIKE-420
>             Project: DeltaSpike
>          Issue Type: New Feature
>          Components: Data-Module
>    Affects Versions: 0.5
>            Reporter: Harald Wellmann
>            Assignee: Thomas Hug
>         Attachments: DELTASPIKE-420_spi.patch
>
>
> It's nice to get semi-automatic repositories from DeltaSpike Data, but these 
> repositories would be even more fun if they were transactional, not 
> necessarily by default, but at least by simple configuration.
> Possible approaches:
> 1) Add @Transactional to an abstract repository class, i.e. 
> javax.transaction.Transactional in Java EE 7, or 
> org.apache.deltaspike.jpa.api.transaction.Transactional otherwise.
> Currently, this does not work due to DELTASPIKE-419.
> 2) Make it easy to override the @Repository binding or the query handler, to 
> add transactional behaviour.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to