41

これは私のXMLファイルです:

<fields>
    <field mappedField="Num">
    </field>
    
    <field mappedField="Type">      
    </field>    
</fields>

解析するために2つのクラス(Fields.javaとField.java)を作成しました。

@XmlRootElement(name = "fields")
public class Fields {

    @XmlElement(name = "field")
    List<Field> fields = new ArrayList<Field>();
        //getter, setter
}

public class Field {

    @XmlAttribute(name = "mappedField")
    String mappedField;
    //getter,setter
}

しかし、私はこの例外を受け取ります:

[INFO] com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
[INFO]  at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66) ~[na:1.6.0_07]
[INFO]  at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:422) ~[na:1.6.0_07]
[INFO]  at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:270) ~[na:1.6.0_07]

この例外が発生する理由がわかりません。例外はここにあります:

JAXBContext context = JAXBContext.newInstance(Fields.class);

JDK1.6_0.0.7を使用しています。ありがとう。

4

12 に答える 12

11

次のいずれかにより、例外が発生する可能性があります。

  1. 空の public コンストラクターを Fields クラスに追加します。JAXB はリフレクションを使用してクラスをロードします。そのため、例外がスローされます。
  2. リストに別のゲッターとセッターを追加します。
于 2012-05-29T08:52:08.873 に答える
11

これは、デフォルトで Jaxb が pojo をシリアライズするときに、プロパティのパブリック メンバー (ゲッターまたはセッター) を介して注釈を検索するためです。ただし、フィールドに注釈を付けています。そのため、プロパティのセッターまたはゲッターの注釈を変更して設定するか、XmlAccessortype をフィールドに設定します。

オプション1::

@XmlRootElement(name = "fields")
@XmlAccessorType(XmlAccessType.FIELD)
public class Fields {

        @XmlElement(name = "field")
        List<Field> fields = new ArrayList<Field>();
        //getter, setter
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

       @XmlAttribute(name = "mappedField")
       String mappedField;
       //getter,setter
}

オプション 2::

@XmlRootElement(name = "fields")
public class Fields {

        List<Field> fields = new ArrayList<Field>();

        @XmlElement(name = "field")
        public List<Field> getFields() {

        }

        //setter
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

       String mappedField;

       @XmlAttribute(name = "mappedField")
       public String getMappedField() {

       }

        //setter
}

詳細については、次の JDK ドキュメントを確認してくださいhttp://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html

于 2012-05-29T09:53:48.680 に答える
2

@XmlTransientで注釈が付けられたクラスで、シリアル化する必要のないフィールドを配置すると考えた後、このメッセージを受け取ったことがあり@XmlAccessorType(XmlAccessType.NONE)ます。

その場合、削除するXmlTransientと問題が解決しました。私は JAXB の専門家ではありませんが、AccessType.NONE が自動シリアル化を実行してはならない (つまり、フィールドをシリアル化するには具体的に注釈を付ける必要がある) ことを示しているため、自動シリアル化XmlTransientからフィールドを除外することが唯一の目的であるため、不正になるのではないかと思います。連載。

于 2014-08-12T17:26:07.100 に答える
0

これと同じ問題がありました.Spring BeanをResponseBodyオブジェクトとして渡していました。new で作成したオブジェクトを返却したところ、すべて問題ありませんでした。

于 2015-03-30T23:10:31.310 に答える
0

これは、同じ名前のクラスが 2 つあるために発生しています。たとえば、settings と settings2 という名前の 2 つの SOAP Web サービスがあり、両方とも同じクラス GetEmployee を持っていますが、これはエラーを証明するあいまいです。

于 2020-06-20T05:19:09.857 に答える
0

私の場合、例外を一時的にキャッチし、必要に応じて (IllegalAnnotationException の深さに基づいて) 原因を調べ、その上で getErrors() を呼び出すことで、問題を見つけることができました。

    try {
        // in my case, this was what gave me an exception
        endpoint.publish("/MyWebServicePort");
    // I got a WebServiceException caused by another exception, which was caused by the IllegalAnnotationsException
    } catch (WebServiceException e) {
        // Incidentally, I need to call getCause().getCause() on it, and cast to IllegalAnnotationsException before calling getErrors()
        System.err.println(((com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException)e.getCause().getCause()).getErrors());
    }
于 2019-10-03T13:16:38.270 に答える