Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate Spring bean definition from a Java object

Let's suggest that I have a bean defined in Spring:

<bean id="neatBean" class="com..." abstract="true">...</bean>

Then we have many clients, each of which have slightly different configuration for their 'neatBean'. The old way we would do it was to have a new file for each client (e.g., clientX_NeatFeature.xml) that contained a bunch of beans for this client (these are hand-edited and part of the code base):

<bean id="clientXNeatBean" parent="neatBean">
    <property id="whatever" value="something"/>
</bean>

Now, I want to have a UI where we can edit and redefine a client's neatBean on the fly.

My question is: given a neatBean, and a UI that can 'override' properties of this bean, what would be a straightforward way to serialize this to an XML file as we do [manually] today?

For example, if the user set property whatever to be "17" for client Y, I'd want to generate:

<bean id="clientYNeatBean" parent="neatBean">
    <property id="whatever" value="17"/>
</bean>

Note that moving this configuration to a different format (e.g., database, other-schema'd-xml) is an option, but not really an answer to the question at hand.

like image 943
joeslice Avatar asked Dec 04 '22 12:12

joeslice


2 Answers

You can download the Spring-beans 2.5 xsd from here and run xjc on it to generate the Java classes with JAXB bindings. Then you can create the Spring-beans object hierarchy on runtime (and manipulate it as you wish) and then serialize it to an XML string using the JAXB Marshaller as shown in Pablojim's answer.

like image 65
Abhinav Sarkar Avatar answered Dec 06 '22 00:12

Abhinav Sarkar


I'd use Jax-b to do this. You'de create a bean object with a list of property objects inside.

@XmlRootElement(name = "bean")
@XmlAccessorType(XmlAccessType.FIELD)

public class Bean {

  @XmlAttribute
  private String id;
  @XmlAttribute
  private String parent;

  @XmlElement(name="property")
  private List<BeanProperty> properties

Then You'd need to also add annotations to BeanProperty. Then when you have a populated object simply marshal it to xml using jaxb:

Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal( myBean, System.out );

For full code examples see: http://java.sun.com/webservices/docs/2.0/tutorial/doc/JAXBUsing.html

Alternatively you could use Groovy - you can drop it in place and creating this xml would be very simple... : http://www.ibm.com/developerworks/java/library/j-pg05199/index.html

like image 36
Pablojim Avatar answered Dec 06 '22 00:12

Pablojim