2016-09-02 16 views
4

だから私は今、私もそれがjackson-dataformat-xml-2.3.0.jarだ使っXMLシリアル化/逆シリアル化ののためにそれを使用しようとしています、今uptil正常JSONのシリアライズ/デシリアライゼーションのためにジャクソンを使用しています。jackson-dataformat-xmlカスタムルート要素を使用したXMLの直列化復元?

私は正常に働いていたStudentクラスに私のJSON(接頭辞でルート名を持つ)をデシリアライズする

objectmapper.reader(Student.class).withRootName("prefix:student").readValue(jsonString)

を使用していました。 Studentに今、私は(接頭辞でルート名を持つ)私のXML文字列をデシリアライズしようとしています

XML:

<prefix:student> 
    <name> 
    Jack Jones 
    </name> 
    <id>1</id> 
</prefix:student> 

マイPOJO:

@XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "name", 
     "id", 
     .... 
    }) 
    @XmlRootElement(name = "student") 
    public class Student 
    { 

     protected String name; 
     BigInteger id; 
.......................... 
    } 

XmlMapperをで使用していますこのよう:

xmlMapper.reader(Student.class).withRootName("prefix:student").readValue(xmlString) 

私は、次の例外を取得:

java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix" 
at [row,col {unknown-source}]: [1,9] 
    at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwXmlAsIOException(StaxUtil.java:24) 
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:473) 
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:26) 
    at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:844) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2091) 

Caused by: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix" 
at [row,col {unknown-source}]: [1,9] 
    at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606) 
    at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479) 
    at com.ctc.wstx.sr.InputElementStack.resolveAndValidateElement(InputElementStack.java:507) 
    at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2977) 
    at com.ctc.wstx.sr.BasicStreamReader.handleRootElem(BasicStreamReader.java:2098) 
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2078) 
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1134) 
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._initializeXmlReader(XmlFactory.java:581) 
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:471) 
    ... 6 more 

私はカスタムのルート名を持つXMLデシリアライズのために何をする必要があります?

+0

あなたのルート要素名はここで定義されているように 'student'ではありません:' @XmlRootElement(name = "student") '! –

+0

@ My-Name-Is:質問を編集しました。基本的には、ルート名の中に名前空間接頭辞があります。したがって、 'student'は' prefix:student'になります。 –

答えて

1

あなたの問題は、それが名前空間宣言が欠落しているとして、XML入力が無効であるということですprefixの場合:名前空間の処理が有効になっている場合(ほとんどの現代のXMLパーサーがそうであるように)、Jackson XMLモジュールはそれについて何もできません。

しかし、他の回答では、基本的なXMLパーサを名前空間の処理を無効にするように構成することができます。その場合、要素名全体が単に「ローカル名」の一部とみなされ、名前空間情報は維持されません。

WoodstoxまたはAalto Staxパーサーのいずれかを使用してください:JDKの1つは名前空間なしモードをサポートしていないと思います。

+0

私は同じ問題を抱えています。 'JacksonMmlModule'と' XmlMapper'でクラスをシリアライズしました。 '@JacksonXmlProperty(localName =" namespaceprefix:localname ")'私は 'com.fasterxml.jackson.core.JsonParseException:未宣言のネームスペースプレフィックス'をジャクソンのXMLモジュールで取得しないように、ローカル名に名前空間プレフィックスを追加することができます。 –

1

が名前空間を無視するようにXmlMapperを設定してください:StaxManはあなたの問題、言ったように

XMLInputFactory input = new WstxInputFactory(); 
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE); 
XmlMapper xmlMapper = new XmlMapper(new XmlFactory(input, new WstxOutputFactory())); 

また、あなたはあなたの @XmlRootElement(name= "student")

@XmlRootElement(name= "prefix:student") にある[編集]を変更する必要があります宣言されていないプレフィックスを使用するという事実から来ています。

これは、あなたが私たちに与えたログ(行1と行9 =>宣言されていない名前空間接頭辞 "接頭辞")によって推測できます。

XML文字列を変更できなかったという印象を受けました。

しかし、あなたができれば、StaxManソリューションはきれいですし、代わりにあなたのパーサ名前空間の検証を無効にするの名前空間宣言を追加する必要があります

<prefix:student xmlns:prefix="http://www.somenamespace.org"> 
    <name> 
    Jack Jones 
    </name> 
    <id>1</id> 
</prefix:student> 
関連する問題