2017-07-21 14 views
0

は私がHTTP GETリクエストを受け入れ、output.Iは、HTTPを介して出力として春ブートXML変更ルート要素名

<response xmlns=""> 
    <userId>235</userId> 
    <amount>345.0</amount> 
</response> 

とし、次のXMLを取得する必要があるとして、XML応答を送信するために、スプリングブートアプリケーションを書いた私のDTOクラスは以下の通りです。

@XmlRootElement(name = "response") 
public class CgPayment { 
    @XmlElement 
    private String userId; 
    @XmlElement 
    private double amount; 

    @XmlElement 
    public String getUserId() { 
     return userId; 
    } 

    @XmlElement 
    public void setUserId(String userId) { 
     this.userId = userId; 
    } 

    @XmlElement 
    public void setAmount(double amount) { 
     this.amount = amount; 
    } 

    @XmlElement 
    public double getAmount() { 

     return amount; 
    } 
} 

しかし、私はOutputとしてレスポンスを得ています。

<CgPayment xmlns=""> 
    <userId>235</userId> 
    <amount>345.0</amount> 
</CgPayment> 
私はルートelement.The応答タイプを使用すると、レスポンスにクラス名を変更しようとしたことがあり
+1

てみ '[これを見る](https://stackoverflow.com/questions/23632419/how-to-deserialize-xml-with-annotations-using-fasterxml?rq= 1)。 'name'属性を' Response'に設定した 'XmlElement'アノテーションは、そのトリックを行うことができます。これを見てください:http://www.duanqu.tech/questions/359704/jackson-annotation-how-to-rename-element-names – Thoomas

+0

@Thoomas、私は@JacksonXmlRootElement(localName = "response")を使いました。それはworikingです。おかげで、あなたは答えとしてこれを投稿することができます。将来の読者にとっても役立ちます。 –

答えて

1

あなたはクラスのレベルで@JacksonXmlRootElement(localName = "response")を使用することができます。私は春ブーツで、次のようにタイプorg.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizerのビーンを登録することであることを達成するための最も簡単な方法だと思います。

のJavadoc:JacksonXmlRootElement` @http://static.javadoc.io/com.fasterxml.jackson.dataformat/jackson-dataformat-xml/2.2.0/com/fasterxml/jackson/dataformat/xml/annotation/JacksonXmlRootElement.html

0

APPLICATION_XML_VALUE

で変更することができますどのように

?あなたのマーシャルはクラスの名前から名前を得ていると思います。

私はこの(多分それが参考になる)

入力した場合は()JAXBElement.class、その後、名前空間()と名前で見つかっ()XmlElementDeclを持つ ファクトリメソッドを指します。 XML要素名は、ファクトリメソッドのXmlElementDeclアノテーションの 要素名です。 その置換グループの要素(そのうちの先頭要素) がXML文書で置換されている場合、要素名は です。 type要素が JAXBElement.classでない場合、XML要素名はXML要素名 であり、その型の注釈 XmlRootElementを使用している型に静的に関連付けられています。型が XmlElementDeclで注釈されていない場合は、エラーです。 type()が JAXBElement.classでない場合、この値は ""でなければなりません。

+0

私が必要とするのは、ルートノード名(開始文字は単純です)としての応答です。私は私の質問を変えました。ありがとう。 –

1

あなたはJAXB固有のアノテーションを使用していますが、ジャクソンはあなたの応答をマーシャルしています。 JAXB注釈はジャクソンで動作させるために、あなたはあなたの構成のためのJaxbAnnotationModuleを登録する必要があり、また、あなたのpom.xml

<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-jaxb-annotations</artifactId> 
</dependency> 

内部jackson-module-jaxb-annotationsを含める必要があります。

@Component 
public class JacksonCustomizer implements Jackson2ObjectMapperBuilderCustomizer { 
    @Override 
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) { 
     jacksonObjectMapperBuilder.modulesToInstall(new JaxbAnnotationModule()); 
} 

または

@Bean 
Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { 
    return (mapperBuilder) -> mapperBuilder.modulesToInstall(new JaxbAnnotationModule()); 
} 
+0

これが受け入れられる回答である必要があります。 springはデフォルトでjacksonを使用しているので、JAXBアノテーションを使用するために 'JaxbAnnotationModule'をインストールする必要があります。 '2.9.0'以降、余分な依存関係ももはや必要ありません。 – membersound

関連する問題