views:

283

answers:

2

I am using JibX as a Java Object to XML Binding tool.

With it, I want to have the following output:

<?xml version="1.0" encoding="UTF-8"?>
<FEAPService>
    <Request>
     <Function>aaa</Function>
     <SubFunction>bbb</SubFunction>
     <Operation>ccc</Operation>
    </Request>
</FEAPService>

But I'm getting this:

<?xml version="1.0" encoding="UTF-8"?>
<FEAPService>
    <Request>
     <baseForm> <!-- I DO NOT WANT THIS baseForm TAG -->
      <Function>aaa</Function>
      <SubFunction>bbb</SubFunction>
      <Operation>ccc</Operation>
     </baseForm>
    </Request>
</FEAPService>

Here's the JibX binding file:

<binding name="requestBinding_com_struts_form_SpecificForm">
    <mapping name="baseForm" class="com.struts.form.BaseForm">
     <value name="Function" field="function" />
     <value name="SubFunction" field="subFunction" />
     <value name="Operation" field="operation" />
    </mapping>    
    <mapping name="FEAPService" class="com.struts.form.SpecificForm"
     extends="com.struts.form.BaseForm">
     <structure name="Request">
         <structure map-as="com.struts.form.BaseForm" />
     </structure>
    </mapping>
</binding>

I guess it might be achieved by implementing my own Marshaller, but I'm not sure if that's the easiest way.

A: 

I managed to remove the undesired XML node, there are 2 ways:

  1. the easy way: just use the abstract="true" attribute.
  2. the hardcore way: implement your own marshaller.


1st option:

<mapping class="com.struts.form.BaseForm" abstract="true">
     <value name="Function" field="function" />
     <value name="SubFunction" field="subFunction" />
     <value name="Operation" field="operation" />
     <value name="doubleField_part1" field="doubleField" serializer="com.struts.form.BaseForm.doubleFieldDeserializer1" />
     <value name="doubleField_part2" field="doubleField" serializer="com.struts.form.BaseForm.doubleFieldDeserializer2" />
    </mapping>

2nd option: implement your own Marshaller:

public class MyMarshaller implements IMarshaller {
    private static final String FUNCTION_ELEMENT_NAME = "Function";
    private static final String SUB_FUNCTION_ELEMENT_NAME = "SubFunction";
    private static final String OPERATION_ELEMENT_NAME = "Operation";

    private String m_uri;
    private int m_index;
    private String m_name;

    public MyMarshaller() {
     m_uri = null;
     m_index = 0;

     m_name = "Function";
    }

    public MyMarshaller(String uri, int index, String name) {
     m_uri = uri;
     m_index = index;
     m_name = name;
    }

    public boolean isExtension(int index) {
     return false;
    }

    public void marshal(Object obj, IMarshallingContext ictx)
      throws JiBXException {

     // make sure the parameters are as expected
     if (!(obj instanceof BaseForm)) {
      throw new JiBXException("Invalid object type for marshaller");
     } else if (!(ictx instanceof MarshallingContext)) {
      throw new JiBXException("Invalid object type for marshaller");
     } else {
      // start by generating start tag for container
      MarshallingContext ctx = (MarshallingContext) ictx;
      BaseForm formBean = (BaseForm) obj;

      /*
       * THIS CODE COULD BE REPEATED FOR ALL FormBean CLASS' ATTRIBUTE USING REFLECTION.
       * And to control which attributes should be marshalled the attributes could follow special nomeclatures.
       * Ex.
       * class FormBean { 
       *    String marshallable_Function;
       *    String non_marshallable_Function;
       * }
       */ 
      writeTag(ctx, formBean.getFunction(), FUNCTION_ELEMENT_NAME);
      writeTag(ctx, formBean.getSubFunction(), SUB_FUNCTION_ELEMENT_NAME);
      writeTag(ctx, formBean.getOperation(), OPERATION_ELEMENT_NAME);
     }
    }

    private void writeTag(MarshallingContext ctx, String value, String entryElementName)
      throws JiBXException {
     ctx.startTag(m_index, entryElementName);
     ctx.closeStartContent();
     ctx.content(value);
     ctx.endTag(m_index, entryElementName);
    }
}


And here is my binding.xml:

<binding name="requestBinding_com_struts_form_SpecificForm">
    <mapping class="com.struts.form.BaseForm" marshaller="example8.MyMarshaller" />        
    <mapping name="FEAPService" class="com.struts.form.SpecificForm">
        <structure name="Request">
            <structure map-as="com.struts.form.BaseForm" />
        </structure>
    </mapping>
</binding>
Lucas -luky- N.
A: 

It's also important that the base (abstract) does not have a name.

Ran Biron