Apparently not supported...   :-(

I've been googling a bit and discovered that it's pretty much impossible to do this from custom namespace BeanDefintionParsers that process the full DOM element themselves. In our case, we feed the DOM element into JAXB to have it parse it into the JAXB bean that was generated from the schema with the jaxb code generator.

The PropertyPlaceholderConfigurer thing only looks at the BeanDefinition arguments that are "String", "List", and "Map" types (and other BeanDefinitions). Thus, it cannot dig into JAXB things that we create to sub in values (and it wouldn't be able to since in the JAXB objects, the type could be something like an int that would hold the property).

I have it semi-working by writing the DOM element to a string and using a factory to re-parse that string later in the factory method. Thus, Spring will see the big long string, sub in the vars, and then we'll re-parse into JAXB. Kind of sucks, but at least semi-works.

The "better" solution would probably be to write a JAXB plugin or something that would process the DOM element and build up a spring BeanDefinition instead of an actual JAXB bean. That's probably quite complex though. We might be able to do it with an XJC plugin that would generate a special "SpringParser" thing for each bean. I definitely need to think about this some more.

In anycase, if I can get the tests passing with my hack, I'll commit it, but I'm really not happy about the solution. It smells of crappy code.

Dan



On May 27, 2008, at 11:44 PM, Jason Dwyer wrote:

hi,

we've been using the SOAP/JMS transport with cxf happily for a couple of
months, and have come to a point where we're setting up deployment
topologies for production environments, and need to make the values for
the jms destination/address configurable.

however, it appears that due to the way cxf loads up beans
automagically, there is no way we are able to reference property
placeholders for the values we want to configure.

eg:

<beans>
...
        <bean id="propertyConfigurer"

class = "org .springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="location">
                        <value>classpath:jms.properties</value>
                </property>
        </bean>
...

        <jms:destination
name="{http://some.namespace.com}AccountServicePort.jms- destination">
                <jms:address destinationStyle="queue"
                        jndiConnectionFactoryName="ConnectionFactory"
                        jndiDestinationName="${acccount.queue.name}"
                        connectionUserName="${jms.username}"
                        connectionPassword="${jms.password}">
                        <jms:JMSNamingProperty 
name="java.naming.factory.initial"
                                value="${connectionFactory.class}" />
                        <jms:JMSNamingProperty name="java.naming.provider.url"
                                value="${jms.host.url}" />
                </jms:address>
        </jms:destination>

</beans>

and in jms.properties, we set up the values as per standard
propertyPLaceholderConfigurer practice.


we've tried moving the jms:destinations into cxf.xml in the root of the
classpath, and let cxf find it by itself, to no avail, as well as
putting all the definitions into our standard applicationContext.xml
which is loaded by the cxf servlet ( as well as programatically with a
ClassPathXmlApplicationContext ).


is there a viable workaround for this?

thanks in advance,

j.dwyer

---
Daniel Kulp
[EMAIL PROTECTED]
http://www.dankulp.com/blog




Reply via email to