Hi Martin,

The Aries subclass proxy honors the "final" modifier and therefore is 
unable to generate a subclass to serve as a proxy when the final modifier 
is used. However, the Aries bytecode weaving proxy is able to inject proxy 
code into final method implementations. So these types of cases are 
handled successfully by the weaving proxy, which is available when ASM 
library bundles are provided in OSGi 4.3 or later environments 
(WeavingHook support).

I'm afraid I don't know anything about Karaf to know why it might use the 
older subclassing proxy instead of weaving or what is different between 
versions that causes that output to surface.

Rich



From:   Martin Lichtin <[email protected]>
To:     "[email protected]" <[email protected]>
Date:   05/11/2014 12:27
Subject:        Unable to create a proxy object for the service ... 
Returning the original object instead



Hi
When moving from Karaf 2.3.4 to 3.0.2 a message from Aries starts to 
appear

"Unable to create a proxy object for the service .component-3 ... 
Returning the original object instead."

It happens with

<bean id="jtaTransactionManager" 
class="org.springframework.transaction.jta.JtaTransactionManager">

The rest of the INFO log output is:

org.apache.aries.proxy.FinalModifierException: The methods protected final 
void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.resume(java.lang.Object,org.springframework.transaction.support.AbstractPlatformTransactionManager$SuspendedResourcesHolder)
 
throws org.springframework.transaction.TransactionException, protected 
final 
org.springframework.transaction.support.AbstractPlatformTransactionManager$SuspendedResourcesHolder
 
org.springframework.transaction.support.AbstractPlatformTransactionManager.suspend(java.lang.Object)
 
throws org.springframework.transaction.TransactionException, public final 
void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setNestedTransactionAllowed(boolean),
 
protected final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.invokeAfterCompletion(java.util.List<org.springframework.transaction.support.TransactionSynchronization>,int),
 
public
 final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setTransactionSynchronization(int),
 
public final int 
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransactionSynchronization(),
 
public final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setDefaultTimeout(int),
 
public final boolean 
org.springframework.transaction.support.AbstractPlatformTransactionManager.isNestedTransactionAllowed(),
 
public final boolean 
org.springframework.transaction.support.AbstractPlatformTransactionManager.isValidateExistingTransaction(),
 
public final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setRollbackOnCommitFailure(boolean),
 
public final boolean 
org.springframework.transaction.support.AbstractPlatformTransactionManager.isRollbackOnCommitFailure(),
 
protected final 
org.springframework.transaction.support.DefaultTransactionStatus
 
org.springframework.transaction.support.AbstractPlatformTransactionManager.prepareTransactionStatus(org.springframework.transaction.TransactionDefinition,java.lang.Object,boolean,boolean,boolean,java.lang.Object),
 
protected final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(org.springframework.transaction.support.DefaultTransactionStatus),
 
protected final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(org.springframework.transaction.support.DefaultTransactionStatus),
 
public final int 
org.springframework.transaction.support.AbstractPlatformTransactionManager.getDefaultTimeout(),
 
public final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setTransactionSynchronizationName(java.lang.String),
 
public final void
 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setValidateExistingTransaction(boolean),
 
public final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setGlobalRollbackOnParticipationFailure(boolean),
 
public final boolean 
org.springframework.transaction.support.AbstractPlatformTransactionManager.isGlobalRollbackOnParticipationFailure(),
 
public final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.setFailEarlyOnGlobalRollbackOnly(boolean),
 
public final boolean 
org.springframework.transaction.support.AbstractPlatformTransactionManager.isFailEarlyOnGlobalRollbackOnly(),
 
public final void 
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(org.springframework.transaction.TransactionStatus)
 
throws org.springframework.transaction.TransactionException, public final 
void
 
org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(org.springframework.transaction.TransactionStatus)
 
throws org.springframework.transaction.TransactionException, public final 
org.springframework.transaction.TransactionStatus 
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(org.springframework.transaction.TransactionDefinition)
 
throws org.springframework.transaction.TransactionException in class 
java.lang.Object are final.
    at 
org.apache.aries.proxy.impl.gen.ProxySubclassGenerator.scanForFinalModifiers(ProxySubclassGenerator.java:352)
    at 
org.apache.aries.proxy.impl.gen.ProxySubclassGenerator.getProxySubclass(ProxySubclassGenerator.java:128)
    at 
org.apache.aries.proxy.impl.gen.ProxySubclassGenerator.newProxySubclassInstance(ProxySubclassGenerator.java:171)
    at 
org.apache.aries.proxy.impl.AsmProxyManager.createNewProxy(AsmProxyManager.java:135)
    at 
org.apache.aries.proxy.impl.AbstractProxyManager.createDelegatingInterceptingProxy(AbstractProxyManager.java:75)
    at 
org.apache.aries.proxy.impl.AbstractProxyManager.createInterceptingProxy(AbstractProxyManager.java:53)
    at 
org.apache.aries.blueprint.container.ServiceRecipe$TriggerServiceFactory.getService(ServiceRecipe.java:535)
   [...]

I assume that there's not much to do here, right, it's just a rare edge 
case that Aries needs to handle?
(For now I just lower the ServiceRecipe log level to warn and plow on..)

Martin



Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU

Reply via email to