JibX: как отобразить класс и избежать его превращения в узел XML - PullRequest
2 голосов
/ 27 февраля 2009

Я использую JibX в качестве инструмента привязки объекта Java к 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>

Полагаю, это может быть достигнуто путем реализации моего собственного Marshaller, но я не уверен, что это самый простой способ.

Ответы [ 2 ]

0 голосов
/ 07 мая 2009

Также важно, чтобы база (аннотация) не имела имени.

0 голосов
/ 27 февраля 2009

Мне удалось удалить нежелательный узел XML, есть 2 способа:

  1. простой способ: просто используйте атрибут abstract = "true".
  2. хардкорный путь: внедрите своего собственного маршаллера.

1-й вариант:

<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-й вариант: реализовать свой собственный маршаллер :

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...