3

JAXBを使用して以下のxmlをアンマーシャリングできません。親切にこれを解決するのを手伝ってください。

私のxmlは次のようになります:

   <powerchanges>
     <initialState creationTime="14.08.2012 16:24:01" status="poweredOff" /> 
     <powerchange changeTime="14.08.2012 16:24:49" status="Powered On" /> 
     <powerchange changeTime="27.09.2012 02:17:23" status="Powered Off" /> 
     <powerchange changeTime="27.09.2012 02:51:13" status="Powered On" /> 
     <powerchange changeTime="29.09.2012 05:06:48" status="Powered Off" /> 
     <powerchange changeTime="29.09.2012 07:40:24" status="Powered On" />   
   </powerchanges>

JAXBを使用して上記のxmlをアンマーシャリングしようとしています。以下は私のJavaクラスです。

PowerChanges.java

@XmlRootElement(name="powerchanges")
public class PowerChanges {
@XmlElement(name = "initialState")
private InitialState initialState;

@XmlElement(name = "powerchange")
private ArrayList<PowerChange> powerChangeList;


public InitialState getInitialState() {
    return initialState;
}
public void setInitialState(InitialState initialState) {
    this.initialState = initialState;
}

public ArrayList<PowerChange> getPowerChangeList() {
    return powerChangeList;
}
public void setPowerChangeList(ArrayList<PowerChange> powerChangeList) {
    this.powerChangeList = powerChangeList;
}

}

PowerChange.java:

public class PowerChange {

  private String changeTime;
  private String status;

  @XmlAttribute
public String getChangeTime() {
    return changeTime;
}
public void setChangeTime(String changeTime) {
this.changeTime = changeTime;
}
@XmlAttribute
public String getStatus() {
return status;
}
public void setStatus(String status) {
    this.status = status;
}

} 

InitialState.java

public class InitialState {

  private String creationTime;
  private String status;

  @XmlAttribute
public String getCreationTime() {
    return creationTime;
}
public void setCreationTime(String creationTime) {
    this.creationTime = creationTime;
}
@XmlAttribute
public String getStatus() {
    return status;
}
public void setStatus(String status) {
    this.status = status;
}

}

4

2 に答える 2

3

デフォルトでは、JAXB(JSR-222)実装は、プロパティ(get / setメソッド)のメタデータを検索します。クラスのフィールドに注釈を付けたのでPowerChanges、クラスに。で注釈を付ける必要があります@XmlAccessorType(XmlAccessType.FIELD)PowerChanges私はあなたのクラスにこの変更を加え、あなたの投稿からXMLを完全に読み取ることができました。

PowerChanges解決策-フィールドアクセスを使用するように変更

import java.util.ArrayList;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "powerchanges")
@XmlAccessorType(XmlAccessType.FIELD)
public class PowerChanges {
    @XmlElement(name = "initialState")
    private InitialState initialState;

    @XmlElement(name = "powerchange")
    private ArrayList<PowerChange> powerChangeList;

    public InitialState getInitialState() {
        return initialState;
    }

    public void setInitialState(InitialState initialState) {
        this.initialState = initialState;
    }

    public ArrayList<PowerChange> getPowerChangeList() {
        return powerChangeList;
    }

    public void setPowerChangeList(ArrayList<PowerChange> powerChangeList) {
        this.powerChangeList = powerChangeList;
    }
}

代替ソリューション-プロパティに注釈を付けるPowerChanges

または、アノテーションをgetメソッドに移動することもできます。

import java.util.ArrayList;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "powerchanges")
public class PowerChanges {
    private InitialState initialState;

    private ArrayList<PowerChange> powerChangeList;

    @XmlElement(name = "initialState")
    public InitialState getInitialState() {
        return initialState;
    }

    public void setInitialState(InitialState initialState) {
        this.initialState = initialState;
    }

    @XmlElement(name = "powerchange")
    public ArrayList<PowerChange> getPowerChangeList() {
        return powerChangeList;
    }

    public void setPowerChangeList(ArrayList<PowerChange> powerChangeList) {
        this.powerChangeList = powerChangeList;
    }
}

詳細については


現在のモデルでは、おそらく次のような例外が発生していました。将来、表示されている例外メッセージを投稿すると、人々がより良い回答を提供するのに役立ちます。

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Class has two properties of the same name "initialState"
    this problem is related to the following location:
        at public forum13229013.InitialState forum13229013.PowerChanges.getInitialState()
        at forum13229013.PowerChanges
    this problem is related to the following location:
        at private forum13229013.InitialState forum13229013.PowerChanges.initialState
        at forum13229013.PowerChanges
Class has two properties of the same name "powerChangeList"
    this problem is related to the following location:
        at public java.util.ArrayList forum13229013.PowerChanges.getPowerChangeList()
        at forum13229013.PowerChanges
    this problem is related to the following location:
        at private java.util.ArrayList forum13229013.PowerChanges.powerChangeList
        at forum13229013.PowerChanges

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:451)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:283)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at forum13229013.Demo.main(Demo.java:12)
于 2012-11-05T11:59:43.367 に答える
0

XmlAccessType.NONEシリアル化する各属性を設定して注釈を付けることもできます。マーシャラーは、注釈が付けられた属性のみを考慮します。

属性powerChangeListは、ゲッターまたは宣言で注釈を付ける必要があります。各要素にも独自の注釈を付ける必要があります@XmlRootElement(name="element")

于 2013-07-03T14:02:13.927 に答える