6

jaxbを使用してxml応答をjavaオブジェクトに変換しようとすると、次のエラーが発生します

       javax.xml.bind.UnmarshalException: unexpected element (uri:"http://SOMETHING/doc/2006-03-01/", local:"Name"). Expected elements are <{}Name>,<{}IsTruncated>,<{}MaxKeys>,<{}Contents>,<{}Prefix>,<{}Marker>

これが私のXMLです:

       <ListBucketResult xmlns="http://something/doc/2006-03-01/">
           <Name>test2</Name>
            <Prefix/>
            <Marker/>
            <MaxKeys>3</MaxKeys>
            <IsTruncated>false</IsTruncated>
            <Contents>
                  <Key>metadata.xml</Key>
                  <LastModified>2012-09-04T08:29:36.000Z</LastModified>
                    <ETag>6b836fd43c402681506926b2248ec418</ETag>
                    <Size>3258</Size>
                   <StorageClass>STANDARD</StorageClass>
             </Contents>
          </ListBucketResult>

そして私のJavaオブジェクトクラスはこのようなものです

            @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "name",
        "prefix",
        "marker",
        "maxKeys",
        "isTruncated",
        "contents"
    })
    @XmlRootElement(name = "ListBucketResult")
    public class ListBucketResult {

@XmlElement(name = "Name", required = true)
protected String name;
@XmlElement(name = "Prefix", required = true)
protected String prefix;
@XmlElement(name = "Marker", required = true)
protected String marker;
@XmlElement(name = "MaxKeys")
protected int maxKeys;
@XmlElement(name = "IsTruncated")
protected boolean isTruncated;
@XmlElement(name = "Contents", required = true)
protected ListBucketResult.Contents contents;







         @XmlAccessorType(XmlAccessType.FIELD)
         @XmlType(name = "", propOrder = {
                "key",
                "lastModified",
                   "eTag",
                   "size",
                 "storageClass"
           })
          public static class Contents {

    @XmlElement(name = "Key", required = true)
    protected String key;
    @XmlElement(name = "LastModified", required = true)
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar lastModified;
    @XmlElement(name = "ETag", required = true)
    protected String eTag;
    @XmlElement(name = "Size")
    protected int size;
    @XmlElement(name = "StorageClass", required = true)
    protected String storageClass;

そして最後に私のアンマーシャリングコードは:

                          JAXBContext jc = JAXBContext.newInstance(ListBucketResult.class);
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());
               JAXBElement element = (JAXBElement) unmarshaller.unmarshal (inputStream);
            ListBucketResult customer = (ListBucketResult) element.getValue();

誰かが私が間違っていることを教えてもらえますか?

4

3 に答える 3

5

@XmlSchemaクラスの注釈を使用してpackage-info、名前空間の修飾を制御できます。既に package-info クラスを作成している場合は、それがコンパイルされていることを確認してください (ant の一部のバージョンでは、package-info クラスに問題がありました)。

パッケージ情報

@XmlSchema( 
    namespace = "http://something/doc/2006-03-01/", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

詳細については

于 2012-09-06T09:02:22.567 に答える
3

XML ドキュメントには「http://something/doc/2006-03-01/」名前空間の一部である要素が含まれていますが、注釈付きの Java クラスはその名前空間に関連付けられていません。@XmlType アノテーションを次のように変更してみてください。

@XmlType(name = "", namespace="http://something/doc/2006-03-01/", propOrder = { ...
于 2012-09-06T04:57:15.420 に答える
0

同様のエラーorg.codehaus.jackson.JsonParseExceptionおよびjavax.xml.bind.UnmarshalExceptionが発生していました: リンクされた例外: [ javax.xml.bind.UnmarshalException: 予期しない要素 (uri:"sometext", local:"elementA")。期待される要素はです。

これは、 RESTEasySpringをJAXBを使用して生成された DTOと統合する場合です。変換にはジャクソンを使用していました。

それを解決するために、Maven 依存関係に Jackson ライブラリを導入し、問題を解決しました。これに固有のジャクソン依存関係は

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.9</version>
    </dependency>

他にも必要な Jackson jar があったため、POM は基本的に次のようになりました。

   //The jackson-core-asl jar contains streaming JSON parser and generator interfaces and implementations
<dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.9</version>
    </dependency>
//Ability to use JAXB annotations containing classes needed to add XML compatibility support.
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.9</version>
    </dependency>
    //Mapper jar contains functionality for data binding: 
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.9</version>
   </dependency> //This dependency makes a JAX-RS implementation like Jersey,RESTEasy use Jackson for binding of JSON to-from Java objects
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.9</version>
    </dependency>
于 2012-12-26T04:38:54.680 に答える