7

私はRESTを使用していますが、jaxbに文字列フィールドを「そのまま」送信xmlに挿入するように指示できるかどうか疑問に思っていました。確かに、返品する前に開梱する必要がありますが、この手順を保存したいと思います。

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

エスケープせずに文字列をそのまま使用するようにJAXBに指示する可能性はありますか? クライアントが応答を解析してからこのフィールドを解析する必要がないようにしたい。

こんにちは、M

4

2 に答える 2

11

を使用して@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);
        }
    }

}

詳細については

于 2012-10-29T14:10:57.530 に答える
2

テキストに '& 文字が含まれている場合 (たとえば、URL や " " などの HTML エンティティを使用している場合)、マーシャリング中にエラーが発生したため、 bdoughanの回答に従うことはできませんでした。

カスタムDomHandlermarshalメソッドを次のように変更することで、これを解決できました

public Source marshal(String et, ValidationEventHandler veh) {
    Node node = new SimpleTextNode(et);
    return new DOMSource(node);
}

whereSimpleTextNodeは Node インターフェースを次のように実装します。

class SimpleTextNode implements Node {
    
    String nodeValue = "";
    
    @Override    
    public SimpleTextNode(String nodeValue) {
        this.nodeValue = nodeValue;
    }
    
    @Override
    public short getNodeType() {
        return TEXT_NODE;
    }

    // the remaining methods of the Node interface are not needed during marshalling
    // you can just use the code template of your IDE...

    ...
}

PS:これをbdoughanの回答へのコメントとして残したいと思っていましたが、残念ながら評判が低すぎます:-(

于 2020-07-31T10:46:10.297 に答える