Jaxb EclipseLink / MOXy: возможно ли указать имена методов get / set - PullRequest
3 голосов
/ 12 января 2012

У меня довольно простой вопрос:

Скажем, у меня есть класс модели, определенный следующим образом:

public class Test{

   private String testAttribute;

   public Test(){

   }

   public String getFormattedTestAttribute(){
      return testAttribute + "A nice formatted thingy"; //right, this is just an example
   }

   public void setTestAttribute(String value){
      testAttribute = value;
   }

}

Вы можете видеть, что у меня есть стандартный установщик для testProperty, но получатель имеет другое имя: getFormattedTestProperty ().

Можно ли в Jaxb / Moxy указать, какой геттер использовать для определенного свойства?

Я использую реализацию MOXy с файлом внешних привязок метаданных. В проекте, над которым я работаю, используется Castor. В файлах сопоставления Castor вы можете указать, какой метод получения / установки использовать следующим образом:

   <field name="testAttribute"
      get-method="getFormattedTestAttribute">
      <bind-xml name="test-attribute" node="attribute"/>
   </field>

Возможно ли то же самое с внешними метаданными moxy?

Если такой вид настройки не поддерживается, возможно ли пометить поле как доступное только для чтения, а другое - только для записи? чтобы я мог объявить свойство только для чтения с именем "formattedTestAttribute" и свойство только для записи с именем "testAttribute" в файл привязок метаданных?

<!-- read only property -->
<xml-element java-attribute="formattedTestAttribute" xml-path="@test-attribute" />

<!-- write only property -->
<xml-element java-attribute="testAttribute" xml-path="@test-attribute" /> 

Обратите внимание, что у меня очень ограниченный контроль над модельными классами.

Заранее спасибо за ваши ответы.

1 Ответ

3 голосов
/ 12 января 2012

Вы можете представить это в документе EclipseLink JAXB (MOXy) для внешнего сопоставления следующим образом:

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum8834871">
    <java-types>
        <java-type name="Test" xml-accessor-type="PUBLIC_MEMBER">
            <xml-root-element/>
            <java-attributes>
                <xml-element 
                    java-attribute="testAttribute" 
                    name="test-attribute">
                    <xml-access-methods 
                        get-method="getFormattedTestAttribute" 
                        set-method="setTestAttribute"/>
                </xml-element>
                <xml-transient java-attribute="formattedTestAttribute"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Test

Iизменили ваш класс Test, чтобы добавить некоторую логику в методы get / set.

package forum8834871;

public class Test{

    private String testAttribute;

    public Test(){
    }

    public String getFormattedTestAttribute(){
       return "APPENDED_ON_GET " + testAttribute;
    }

    public void setTestAttribute(String value){
       testAttribute = "APPENDED_ON_SET " + value;
    }

}

Демо

package forum8834871;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum8834871/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Test.class}, properties);

        File xml = new File("src/forum8834871/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Test test = (Test) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(test, System.out);
    }

}

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <test-attribute>ORIGINAL</test-attribute>
</test>

Выход

<?xml version="1.0" encoding="UTF-8"?>
<test>
   <test-attribute>APPENDED_ON_GET APPENDED_ON_SET ORIGINAL</test-attribute>
</test>
...