2012-10-29 56 views
5

我使用REST,我想知道如果我可以告诉jaxb插入一个字符串字段“原样”到传出的XML。 当然,我计算之前解压缩它,但我想保存这一步。JAXB使用字符串,因为它是

@XmlRootElement(name="unnestedResponse") 
public class Response{ 
@Insert annotation here ;-) 
private String alreadyXml; 
private int otherDate; ... 
} 

是否存在告诉JAXB仅仅使用字符串而不逃脱的可能性?我希望客户端不必解析我的响应,然后解析这个字段。

问候, 米

+0

[使用JAXB提取XML元素的内部文本]的可能重复(http://stackoverflow.com/questions/5537416/using-jaxb-to-extract-inner-text-of-xml-element) –

回答

8

您可以使用@XmlAnyElement并指定一个DomHandler保持XML文档的一部分作为String

客户

import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Customer { 

    private String bio; 

    @XmlAnyElement(BioHandler.class) 
    public String getBio() { 
     return bio; 
    } 

    public void setBio(String bio) { 
     this.bio = bio; 
    } 

} 

BioHandler

import java.io.*; 
import javax.xml.bind.ValidationEventHandler; 
import javax.xml.bind.annotation.DomHandler; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.*; 

public class BioHandler implements DomHandler<String, StreamResult> { 

    private static final String BIO_START_TAG = "<bio>"; 
    private static final String BIO_END_TAG = "</bio>"; 

    private StringWriter xmlWriter = new StringWriter(); 

    public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) { 
     return new StreamResult(xmlWriter); 
    } 

    public String getElement(StreamResult rt) { 
     String xml = rt.getWriter().toString(); 
     int beginIndex = xml.indexOf(BIO_START_TAG) + BIO_START_TAG.length(); 
     int endIndex = xml.indexOf(BIO_END_TAG); 
     return xml.substring(beginIndex, endIndex); 
    } 

    public Source marshal(String n, ValidationEventHandler errorHandler) { 
     try { 
      String xml = BIO_START_TAG + n.trim() + BIO_END_TAG; 
      StringReader xmlReader = new StringReader(xml); 
      return new StreamSource(xmlReader); 
     } catch(Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

更多信息

+0

一个重要的注意事项,如果你使用这个进行封送处理和使用标准的JAXB:而不是象本例中那样传入一个字符串,你必须传入一个org.w3c.dom.Element接口的实现。否则,JAXB将不会使用DOMHandler进行封送处理。实现并不需要实际做任何有用的事情,所以你可以在其中存储一个String,然后在编组方法中将其取出,并按照上面其余部分的示例进行操作,但它必须是一个实例对象实现元素。 –

+0

@Gabriel - 这是标准的JAXB。它有可能在JAXB参考实现中存在一个错误。 –

相关问题