2012-10-29 12 views
5

REST kullanıyorum ve jaxb 'in-x-dizinine "as-it-is" şeklinde bir string alanı eklemesini söyleyebilirim. Kesinlikle geri göndermeden önce paketi açmayı kabul ediyorum, ancak bu adımı kaydetmek istiyorum.JAXB, String kullanıyor olduğu gibi

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

JAXB'ye yalnızca Dizgeyi kaçmadan kullanıldığını söylemek mümkün mü? İstemcimin yanıtımı ayrıştırması ve sonra bu alanı ayrıştırması gerekmiyor.

selam, m

+0

olası kopyası [XML öğesinin iç metnini çıkarmak için JAXB kullanma] (http://stackoverflow.com/questions/5537416/using-jaxb-to-extract-inner-text-of-xml-element) –

cevap

8

Bir String gibi XML belgenin bir kısmını tutmak için bir DomHandler@XmlAnyElement kullanabilir ve belirtebilirsiniz.

Fazla Bilgi İçin Müşteri

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

Bunu marshaling ve standart JAXB kullanarak kullanıyorsanız, önemli bir not: Bu örnekte olduğu gibi bir String içinde geçmek yerine, org.w3c.dom.Element arabiriminin bir uygulamasından geçmek zorundasınız. Aksi takdirde JAXB, DOMHandler'ı marşlama için kullanmayacaktır. Uygulamanın aslında yararlı bir şey yapması gerekmiyor, bu yüzden bir String'i ona kaydedebilir ve ardından mareşal yöntemine getirebilir ve yolun geri kalanındaki örneği takip edebilir, ancak bir örneğinin olması gerekir. Nesne uygulayan nesne. –

+0

@Gabriel - Bu standart JAXB'dir. JAXB referans uygulamasında bir hata olması mümkündür. –