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
