Какая реализация JAXB реализует Marshaller.getNode ()? - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь добавить комментарий к сгенерированному JAXB XML-результату @GET, что не кажется простой задачей. Я использую Spring, и У меня нет прямого доступа к сортировке и DOM .

Добавив public void beforeMarshal (Marshaller m) к моему @XmlElement, я должен иметь доступ к DOM с помощью Marshaller # getNode (Object) и, таким образом, иметь возможность Добавить комментарий.

Проблема в AbstractMarshallerImpl # getNode (Object) :

По умолчанию метод getNode имеет вид Воспоминания и бросить java.lang.UnsupportedOperationException. Реализации, которые решили поддержать этот метод должен переопределить этот метод.

Реализован ли getNode (Object) какими-либо реализациями JAXB?

1 Ответ

2 голосов
/ 06 июня 2011

Примечание: Я возглавляю EclipseLink JAXB (MOXy) и являюсь членом группы экспертов JAXB 2 ( JSR-222 ).

<Ч />

MOXy в настоящее время не поддерживает дополнительный метод getNode, см. (Запрос на улучшение https://bugs.eclipse.org/332762). Однако, JAXB Binder может быть полезен в этом случае использования:

Демо

import javax.xml.bind.Binder;
import javax.xml.bind.JAXBContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Demo {

    public static void main(String[] args) throws Exception {
        Customer customer = new Customer();
        customer.setName("Jane Doe");

        PhoneNumber homePhoneNumber = new PhoneNumber();
        customer.getPhoneNumbers().add(homePhoneNumber);

        PhoneNumber workPhoneNumber = new PhoneNumber();
        customer.getPhoneNumbers().add(workPhoneNumber);

        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Binder<Node> binder = jc.createBinder();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.newDocument();

        binder.marshal(customer, document);
        Node homePhoneNumberElement = binder.getXMLNode(homePhoneNumber);
        Comment comment = document.createComment("My Comment");
        homePhoneNumberElement.appendChild(comment);

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(System.out);
        t.transform(source, result);
    }

}

Клиент

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private String name;

    private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name="phone-number")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

}

PhoneNumber

public class PhoneNumber {

}
...