Issue Details (XML | Word | Printable)

Key: SPR-5869
Type: Sub-task Sub-task
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Juergen Hoeller
Reporter: Troy Harris
Votes: 1
Watchers: 2
Operations

If you were logged in you would be able to see more operations.
Spring Framework
SPR-4720

exposeAccessContext doesn't resolve the issues with secure JMS and WebLogic.

Created: 25/Jun/09 03:14 PM   Updated: 31/Jan/10 09:00 AM   Resolved: 31/Jan/10 09:00 AM
Component/s: SpringJMS
Affects Version/s: 2.5.5
Fix Version/s: 3.0.1

Time Tracking:
Not Specified

Environment: I've tested this on Solaris 10 (SPARC) and Windows Server 2003 both with Java 5.

Virtual Machine: Sun JVM - 1.5
Platform: BEA WebLogic - 9.2
Spring Forum Reference:: http://forum.springsource.org/showthread.php?t=63338


 Description  « Hide

Has the addition of exposeAccessContext been tested and verified with WebLogic? I have tested this with the different installation and also have seen one post in the Spring Forums where this is not working either.

I get one of two failures based on what I pass in using the jndiName property tag used to do the look-up. If I used the real JNDI name then I get:

Cannot resolve reference to bean 'queueConnectionFactory' while setting bean prope
rty 'connectionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with n
ame 'queueConnectionFactory' defined in ServletContext resource [/WEB-INF/spring-config/infrastructure-config.xml]: Invocation o
f init method failed; nested exception is java.lang.IllegalAccessError: class weblogic.jms.client.$Proxy235 cannot access its su
perinterface weblogic.jms.client.Reconnectable.

If I use the JNDI name based on the res-ref then I get "access denied", and authentication failure on the send from WebLogic, so the required credentials have still been lost along the way.

Here is my config:

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.security.authentication">simple</prop>
<prop key="java.naming.security.principal">jmsuser<prop>
<prop key="java.naming.security.credentials">jmspassword</prop>
</props>
</property>
</bean>

<bean id="queueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="exposeAccessContext" value="true"/>
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="my/jms/QueueConnectionFactory" />
</bean>

<bean id="testJmsEventSender" class="troy.jms.EvenSender">
<property name="jmsTemplate">
<bean class="org.springframework.jms.core.JmsTemplate">
<property name="defaultDestination" ref="testDestination" />
<property name="connectionFactory" ref="queueConnectionFactory" />
</bean>
</property>
</bean>



Klaus Kreuzwieser added a comment - 29/Jan/10 09:19 AM

I've tested the property with WebLogic 10.3 - no success either. Since WebLogic is an important application server, can anybody at SpringSource really fix the problem SPR-4720?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'assetArenaJmsTemplate' defined in URL [zip:/opt/weblogic/user_projects/domains/rcm_domain/servers/appl/tmp/_WL_user/ServiceProviderAssetArena/gd6r2c/war/WEB-INF/lib/_wl_cls_gen.jar!/applicationContext-aa-import.xml]: Cannot resolve reference to bean 'assetArenaConnectionFactory' while setting bean property 'connectionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'assetArenaConnectionFactory' defined in URL [zip:/opt/weblogic/user_projects/domains/rcm_domain/servers/appl/tmp/_WL_user/ServiceProviderAssetArena/gd6r2c/war/WEB-INF/lib/_wl_cls_gen.jar!/applicationContext-aa-import.xml]: Invocation of init method failed; nested exception is java.lang.IllegalAccessError: tried to access class weblogic/jms/client/Reconnectable from class weblogic/jms/client/$Proxy131
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:475)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:280)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1055)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:481)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:181)
at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1799)
at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3041)
at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1374)
at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:452)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:117)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:204)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:60)
at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:629)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:37)
at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:206)
at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:53)
at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:161)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.activate(AbstractOperation.java:569)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.activateDeployment(ActivateOperation.java:140)
at weblogic.deploy.internal.targetserver.operations.ActivateOperation.doCommit(ActivateOperation.java:106)
at weblogic.deploy.internal.targetserver.operations.AbstractOperation.commit(AbstractOperation.java:323)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleDeploymentCommit(DeploymentManager.java:844)
at weblogic.deploy.internal.targetserver.DeploymentManager.activateDeploymentList(DeploymentManager.java:1253)
at weblogic.deploy.internal.targetserver.DeploymentManager.handleCommit(DeploymentManager.java:440)
at weblogic.deploy.internal.targetserver.DeploymentServiceDispatcher.commit(DeploymentServiceDispatcher.java:163)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.doCommitCallback(DeploymentReceiverCallbackDeliverer.java:181)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer.access$100(DeploymentReceiverCallbackDeliverer.java:12)
at weblogic.deploy.service.internal.targetserver.DeploymentReceiverCallbackDeliverer$2.run(DeploymentReceiverCallbackDeliverer.java:67)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:516)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)


Juergen Hoeller added a comment - 31/Jan/10 08:27 AM

This seems to be a problem with the interfaces that the WebLogic-provided reference implements: By default, in case of exposeAccessContext=true, we'll proxy all interfaces that we detect. That WebLogic Reconnectable interface seems to be package-protected or the like, failing when trying to use it as an interface for a JDK reflection proxy.

One possible solution is to explicitly specify the proxy interface to use on the JndiObjectFactoryBean definition:
<property name="proxyInterface" value="javax.jms.QueueConnectionFactory"/>

We might be able to revise our default proxy interface detection to exclude such WebLogic-internal interfaces. I'll have a look at that for Spring 3.0.1.

Juergen


Juergen Hoeller added a comment - 31/Jan/10 09:00 AM

As of Spring 3.0.1, JndiObjectFactoryBean explicitly only chooses public interfaces as default proxy interfaces. This should hopefully skip those WebLogic internal interfaces as well, without the need for specifying an explicit 'proxyInterface' value.

Juergen