6

JAXB を使用して long プリミティブ型をマーシャリングするために、XmlJavaTypeAdapter非 String 型を String に適応させる @ アノテーションを使用しました。長いタイプのエラーをスローしますが。なぜそうなのですか?longid 属性をマーシャリングするにはどうすればよいですか?

ユーザー.java

class User {
    @XmlID
    @XmlJavaTypeAdapter(WSLongAdapter.class)
    private long id;
    // Other variables
    // Getter & Setter method
}    

WSLongAdapter.java

    public class WSLongAdapter extends XmlAdapter<String, Long>{
        @Override
        public String marshal(Long id) throws Exception {
            if(id==null) return "" ;
            return id.toString();
        }
        @Override
        public Long  unmarshal(String id) throws Exception {
        return  Long.parseLong(id);
        }
     }

MarshallTest.java

public static void main(String[] args) {
    try{
        JAXBContext jaxbContext= JAXBContext.newInstance(User.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        OutputStreamWriter writer = new OutputStreamWriter(System.out);
        // Manually open the root element
        writer.write("<user>");
        // Marshal the objects out individually
        marshaller.marshal(new User(), writer);
        // Manually close the root element
        writer.write("</user>");
        writer.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

エラー:

  com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions
Adapter com.v4common.shared.util.other.WSLongAdapter is not applicable to the field type long. 
    this problem is related to the following location:
        at @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=class javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT, value=class com.v4common.shared.util.other.WSLongAdapter)
        at private long com.v4common.shared.beans.usermanagement.User.id
        at com.v4common.shared.beans.usermanagement.User
Property "id" has an XmlID annotation but its type is not String.
    this problem is related to the following location:
        at private long com.v4common.shared.beans.usermanagement.User.id
        at com.v4common.shared.beans.usermanagement.User
There are two properties named "id" 
4

4 に答える 4

8

アノテーションでプリミティブ クラスを指定します。

@XmlJavaTypeAdapter(type=long.class, value=WSLongAdapter.class)
于 2013-11-05T16:32:55.083 に答える
5

以下はうまくいくかもしれません:

class User {
    @XmlID
    @XmlJavaTypeAdapter(WSLongAdapter.class)
    @XmlElement(type=Long.class)
    private long id;
    // Other variables
    // Getter & Setter method
}    
于 2012-12-27T10:25:51.957 に答える
1

@XmlIDその戻り値で注釈が付けられた新しいゲッターを作成しますString

@XmlAccessorType(XmlAccessType.FIELD)
class User {

    private long id;

    @XmlID
    public String getReferenceId() {
        return Long.toString(id);
    }

}

このソリューションの唯一の欠点は、シリアル化された XML に追加のタグが存在することです (この場合は<referenceId>)。そのゲッターに注釈を付けて削除しようとしました@XmlTransientが、参照されたクラスにIDが存在しないことを通知するエラーが発生しました。

于 2015-11-17T15:18:31.420 に答える