2009-02-27 7 views
2

J'utilise JibX en tant qu'outil Java Object to XML Binding.JibX: comment mapper une classe et éviter qu'elle soit sortie en tant que noeud XML

Avec elle, je veux avoir la sortie suivante:

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

Mais je reçois ceci:

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

Voici le fichier de liaison 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 Je suppose que cela pourrait être réalisé en mettant en œuvre mon propre Marshaller, mais je ne suis pas sûr que ce soit le moyen le plus simple.

Répondre

0

j'ai réussi à supprimer le nœud XML indésirable, il y a 2 façons:

  1. la voie facile: il suffit d'utiliser l'abstract = "true".
  2. la manière hardcore: implémenter votre propre marshaller.

1ère 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> 

2ème option: implémenter votre propre 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); 
    } 
} 

Et voici mon 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

Il est également important que la base (abstraite) ne pas avoir un nom.

Questions connexes