jaxbでは、xmlファイルを読み込もうとしていますが、xmlファイル内のいくつかの要素のみが興味深いので、多くの要素をスキップしたいと思います
xMLを読みます
<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2010 rel. 3 sp1 (http://www.altova.com)-->
<flx:ModeleREP xsi:schemaLocation="urn:test:mod_rep.xsd mod_rep.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:flx="urn:test:mod_rep.xsd">
<flx:DocumentHeader>
<flx:Identification v="04489"/>
</flx:DocumentHeader>
<flx:TimeSeries>
<flx:Identification v="test1a"/>
<flx:BusinessType v="A01"/>
<flx:Product v="123a"/>
<flx:ResourceObject codingScheme="N" v="testa"/>
<flx:Period>
<flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/>
<flx:Resolution v="PT2H"/>
<flx:Pt>
<flx:P v="1"/>
<flx:Q unitCode="String" v="1.0"/>
<flx:A currencyIdentifier="String" v="195.0"/>
</flx:Pt>
</flx:Period>
</flx:TimeSeries>
<flx:TimeSeries>
<flx:Identification v="test2a"/>
<flx:BusinessType v="A01"/>
<flx:Product v="a123b"/>
<flx:ResourceObject codingScheme="N" v="test2"/>
<flx:Period>
<flx:TimeInterval v="2011-07-02T00:00/2011-07-16T00:00"/>
<flx:Resolution v="PT2H"/>
<flx:Pt>
<flx:P v="1"/>
<flx:Q unitCode="String" v="1.0"/>
<flx:A currencyIdentifier="String" v="195.0"/>
</flx:Pt>
<flx:Pt>
<flx:P v="2"/>
<flx:Q unitCode="String" v="1.0"/>
<flx:A currencyIdentifier="String" v="195.0"/>
</flx:Pt>
</flx:Period>
</flx:TimeSeries>
</flx:ModeleREP>
私のクラス
@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd")
public class ModeleREP {
@XmlElement(name="TimeSeries")
protected List<TimeSeries> timeSeries;
public List<TimeSeries> getTimeSeries() {
if (this.timeSeries == null) {
this.timeSeries = new ArrayList<TimeSeries>();
}
return this.timeSeries;
}
public void setTimeSeries(List<TimeSeries> timeSeries) {
this.timeSeries = timeSeries;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "TimeSeries")
public class TimeSeries {
@XmlElement(name="ResourceObject")
protected RessourceObject resourceObject;
@XmlElement(name = "Period")
protected Period period;
public RessourceObject getResourceObject() {
return this.resourceObject;
}
public void setResourceObject(RessourceObject resourceObject) {
this.resourceObject = resourceObject;
}
public Period getPeriod() {
return this.period;
}
public void setPeriod(Period period) {
this.period = period;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ResourceObject")
public class RessourceObject {
@XmlAttribute(name = "codingScheme")
protected String codingScheme;
@XmlAttribute(name = "v")
protected String v;
public String getCodingScheme() {
return this.codingScheme;
}
public void setCodingScheme(String codingScheme) {
this.codingScheme = codingScheme;
}
public String getV() {
return this.v;
}
public void setV(String v) {
this.v = v;
}
}
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "Period")
public class Period {
@XmlElement(name = "TimeInterval")
protected TimeInterval timeInterval;
@XmlElement(name = "Pt")
protected List<Pt> pt;
public TimeInterval getTimeInterval() {
return this.timeInterval;
}
public void setTimeInterval(TimeInterval timeInterval) {
this.timeInterval = timeInterval;
}
public List<Pt> getPt() {
if (this.pt == null) {
this.pt = new ArrayList<Pt>();
}
return this.pt;
}
public void setPt(List<Pt> pt) {
this.pt=pt;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "TimeInterval")
public class TimeInterval {
@XmlAttribute(name = "v")
private String timeIntervalPeriod;
public String getTimeIntervalPeriod() {
return this.timeIntervalPeriod;
}
public void setTimeIntervalPeriod(String timeIntervalPeriod) {
this.timeIntervalPeriod = timeIntervalPeriod;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Pt")
public class Pt {
@XmlElement(name = "P")
protected P p;
@XmlElement(name = "A")
protected A a;
public P getP() {
return this.p;
}
public void setP(P p) {
this.p = p;
}
public A getA() {
return this.a;
}
public void setA(A a) {
this.a = a;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "P")
public class P {
@XmlAttribute(name = "v")
protected String position;
public String getPosition(){
return this.position;
}
public void setPosition(String position){
this.position=position;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "A")
public class A {
@XmlAttribute(name = "v")
protected String calculatedAmount;
public String getCalculatedAmount() {
return this.calculatedAmount;
}
public void setCalculatedAmount(String calculatedAmount) {
this.calculatedAmount = calculatedAmount;
}
}
xlmファイルを読み取ろうとすると、
com.Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "timeSeries"
this problem is related to the following location:
at public Java.util.List testjaxp.ModeleREP.getTimeSeries()
at testjaxp.ModeleREP
this problem is related to the following location:
at protected Java.util.List testjaxp.ModeleREP.timeSeries
at testjaxp.ModeleREP
私はこのエラーを理解していません
編集:jaxb-impl-2.1.12を使用します
さて、エラーはありませんが、オブジェクトをチェックすると、timeSeriesはnullです.
jaxbはflxに問題があるようです。
私もこのような問題に直面し、これを設定しました。
@XmlRootElement(name="yourRootElementName")
@XmlAccessorType(XmlAccessType.FIELD)
これは100%動作します
使用しているJAXB-IMPLバージョンを指定しませんでしたが、一度同じ問題(jaxb-impl 2.0.5で)が発生し、メンバーレベルではなくゲッターレベルでアノテーションを使用して解決しました。
このような似たような問題もいくつか見ました。
これは、placeが「@ XMLElement "annotation(bean)クラス。
そして、JAXB(注釈プロセッサ)は、@ XMLElementを使用すると、同じフィールド要素のメンバーフィールドとゲッターメソッドを異なるプロパティと見なしますフィールドレベルの注釈で、IllegalAnnotationExceptions例外をスローします。
例外メッセージ:
クラスには2つのプロパティsamename "timeSeries"があります
ゲッターメソッドで:
at public Java.util.List testjaxp.ModeleREP.getTimeSeries()
メンバーフィールドで:
at protected Java.util.List testjaxp.ModeleREP.timeSeries
Solution:fieldで@ XmlElementを使用する代わりに、 getterメソッドで。
これをクラスに追加しました
@XmlAccessorType(XmlAccessType.FIELD)
チャムのように働いた
JAXBはgetTimeSeries()
メソッドとメンバーtimeSeries
の両方を見ています。どのJAXB実装を使用しているのか、またはその設定を言っているのではありませんが、例外はかなり明確です。
public Java.util.List testjaxp.ModeleREP.getTimeSeries()で
そして
保護されたJava.util.Listでtestjaxp.ModeleREP.timeSeries
アノテーションを(@XmlElement(name="TimeSeries")
に従って)使用し、パブリックメソッドを無視するようにJAXBを構成する必要があります。
複数の解決策がありますが、基本的に変数宣言に注釈を付ける場合は@XmlAccessorType(XmlAccessType.FIELD)
が必要ですが、getメソッドまたはsetメソッドのいずれかに注釈を付ける場合は必要ありません。
だからあなたができる:
@XmlRootElement(name="MY_CLASS_A")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyClassA
{
@XmlElement(name = "STATUS")
private int status;
//.. and so on
}
または:
@XmlRootElement(name="MY_CLASS_A")
public class MyClassA
{
private int status;
@XmlElement(name = "STATUS")
public int getStatus()
{
}
}
以下の注釈を使用して「@XmlElement」注釈を削除すると、コードは適切に動作し、結果のXMLにはクラスメンバーに類似した要素名が付けられます。
@XmlRootElement(name="<RootElementName>")
@XmlAccessorType(XmlAccessType.FIELD)
「@XmlElement」の使用が本当に必要な場合は、フィールドレベルとして定義してください。コードは完全に機能するはずです。ゲッターメソッドの上部にアノテーションを定義しないでください。
上記の両方のアプローチを試し、問題を修正しました。
クラスModeleREP
で行ったように、クラスTimeSeries
も@XmlAccessorType(XmlAccessType.FIELD)
で設定する必要があります。
OOXS もご覧ください
これらは、JAXBが検討している2つのプロパティです。
public Java.util.List testjaxp.ModeleREP.getTimeSeries()
そして
protected Java.util.List testjaxp.ModeleREP.timeSeries
これは、以下で説明するようにgetメソッドでJAXBアノテーションを使用することで回避できます。
@XmlElement(name="TimeSeries"))
public Java.util.List testjaxp.ModeleREP.getTimeSeries()
xMLに変換するクラスでメンバー変数をprivateに宣言するだけです。ハッピーコーディング
"クラスには同じ名前の例外の2つのプロパティがあります"クラスメンバーxがある場合に発生する可能性があります同じメンバーのパブリックアクセスレベルとゲッター/セッターを使用します。
Javaの経験則として、ゲッターとセッターとともにpublicアクセスレベルを使用することはお勧めしません。
詳細については、これを確認してください: パブリックプロパティVSゲッター付きプライベートプロパティ
それを修正するには:
私が直面した同じ問題、私は追加しました
@XmlRootElement(name="yourRootElementName")
@XmlAccessorType(XmlAccessType.FIELD)
そして今、それは働いています。
私はちょうどこの問題に遭遇し、それを解決しました。
問題の原因は、XmlAccessType.FIELDとゲッターとセッターのペアの両方があることです。解決策は、セッターを削除し、デフォルトのコンストラクターとすべてのフィールドを取得するコンストラクターを追加することです。
次のような署名を持つサービスクラスがありました」
@WebMethod
public FetchIQAStatusResponseVO fetchIQAStatus(FetchIQAStatusRequest fetchIQAStatusRequest) {
実行時に、FetchIQAStatusResponseVO
フィールドに対して同じエラーが発生しました。 FetchIQAStatusResponseVO
の上に行を追加しました:
@XmlAccessorType(XmlAccessType.FIELD) //This line added
public class FetchIQAStatusResponseVO {
これで問題は解決しました。
アノテーションをゲッターの前に配置し、保護された属性から削除すると機能します。
protected String codingScheme;
@XmlAttribute(name = "codingScheme")
public String getCodingScheme() {
return this.codingScheme;
}
この問題をすばやく簡単に解決する方法は、変数宣言ステートメントprotected List<TimeSeries> timeSeries;
の上部からそのゲッター@XmlElement(name="TimeSeries")
の上部までpublic List<TimeSeries> getTimeSeries()
を削除することです。
したがって、ModeleREP
クラスは次のようになります。
@XmlRootElement(name="ModeleREP", namespace="urn:test:mod_rep.xsd")
public class ModeleREP {
protected List<TimeSeries> timeSeries;
@XmlElement(name="TimeSeries")
public List<TimeSeries> getTimeSeries() {
if (this.timeSeries == null) {
this.timeSeries = new ArrayList<TimeSeries>();
}
return this.timeSeries;
}
public void setTimeSeries(List<TimeSeries> timeSeries) {
this.timeSeries = timeSeries;
}
}
それが役に立てば幸い!
@XmlTransient
注釈を付けると、その問題が解決します
@XmlTransient
public void setTimeSeries(List<TimeSeries> timeSeries) {
this.timeSeries = timeSeries;
}
詳細については、 http://docs.Oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlTransient.html をご覧ください。