2009-02-27 1 views
2

Я использую JibX как инструмент привязки Java Object to XML.JibX: как отобразить класс и избежать его вывода в виде узла XML

С этим, я хочу иметь следующий вывод:

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

Но я получаю это:

<?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> 

Вот JiBX связывания файла:

<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 предположим, что это может быть достигнуто путем реализации моего собственного Маршаллера, но я не уверен, что это самый простой способ.

ответ

0

мне удалось удалить нежелательную узел X, есть 2 способа:

  1. простой способ: просто использовать абстрактный = «истинный» атрибут.
  2. hardcore way: реализовать свой собственный маршаллер.

первый вариант:

<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> 

второй вариант: реализовать свой собственный ИАС:

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); 
    } 
} 

А вот мой 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> 
0

Это также важно, чтобы основание (аннотация) не есть имя.