【问题标题】:Which JAXB implementation implements Marshaller.getNode()?哪个 JAXB 实现实现了 Marshaller.getNode()?
【发布时间】:2011-06-06 11:17:42
【问题描述】:

我正在尝试 add a comment 到 JAXB 生成的 XML @GET 结果,这似乎不是一个简单的任务。我正在使用 Spring,I don't have direct access to the marshalling and DOM

通过将public void beforeMarshal(Marshaller m) 添加到我的@XmlElement,我应该能够使用Marshaller#getNode(Object) 访问DOM,从而能够添加评论。

问题是AbstractMarshallerImpl#getNode(Object):

默认情况下,getNode 方法是 不受支持并抛出 java.lang.UnsupportedOperationException。 选择支持的实现 此方法必须覆盖此方法。

getNode(Object) 是否由任何 JAXB 实现实现?

【问题讨论】:

    标签: java xml spring jaxb marshalling


    【解决方案1】:

    注意:我领导 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;
        }
    
    }
    

    电话号码

    public class PhoneNumber {
    
    }
    

    【讨论】:

    • 谢谢,布莱斯!问题是,我不直接使用 JAXBContext。我只是用 @GET 注释我的方法并返回一个 Response.ok(entity).build()。
    • @neu242 - 对于这个用例,您可以利用 JAX-RS 的 MessageBodyReader/MessageBodyWriter 概念。有关如何将其与 JAXB 一起使用的示例,请参阅:stackoverflow.com/questions/3428273/…
    • 好的,我有一个@Path("/myApi") @Component @Scope("request") @Produces({"application/json", "application/xml"}) public class MyResource , 使用方法 @GET public Response myMethod() { MyEntity entity = getEntity();返回 Response.ok(entity).build();}。现在,我创建了一个额外的 @Provider @Consumes({"application/xml", "application/json"}) 公共类 ValidatingReader 实现 MessageBodyReader { ... } 就像在你的例子中一样。 MessageBodyReader 似乎没有被触发,我错过了什么?
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多