1

XML から Java Object への変換に関する問題があります。ここでは JAXB を使用します。
私の場合:

XML データ:

<persons>
  <person>
     <name>Aris Tonar</name>
     <age />
     <nickname />
     <saldo />
  </person>
</persons>

XML データの Java クラス :

public class Person{
   private String name;
   private Integer age;
   private String nickName;
   private Integer id;
   private Double saldo;

   /**
   *Setter and Getter
   */

}

そして、標準のJAXBContext Unmarshallerコードを使用してJavaオブジェクトに解析する場合。コード付き:

JAXBContext context = JAXBContext.newInstance(Person.class.getPackage().getName());
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement element = (JAXBElement) unmarshaller.unmarshal(new StreamSource(new StringReader(stringOfXmlData.toString())));
Person obj = (Person) element.getValue();

結果が得られます: Person name = "Aris Tonar"
Person age = null Person Nickname =
""
Person id = null
Person saldo = null

しかし、私が望む結果ではなく、JAXBが結果を出すことを望みます:

人物名 = "Aris Tonar"
人物年齢 = 0
人物ニックネーム = ""
人物 ID = null
人物サルド = 0

  1. XML DATA で宣言されたすべての要素が必要です: 値が指定されている場合、jaxb は通常 (name 要素のように) として解釈しますが、値が指定されていない場合、jaxb はデフォルト値 (age、nickname、saldo 要素など) として解釈します。
  2. 要素が XML データで宣言されていない場合、jaxb はそれを null として解釈します (id 要素のように)。

できるかどうか?JAXBContextコードのカスタマイズに関係している可能性があります??

4

4 に答える 4

3

少し面倒ですが、型アダプターを使用して目的を達成できるはずです。

public class Person{
   private String name;
   @XmlJavaTypeAdapter(IntegerZeroDefaultAdapter.class)
   @XmlSchemaType(name = "integer")
   private Integer age;
   private String nickName;
   private Integer id;
   @XmlJavaTypeAdapter(DoubleZeroDefaultAdapter.class)
   @XmlSchemaType(name = "double")
   private Double saldo;
   // ...    
}

public class IntegerZeroDefaultAdapter extends XmlAdapter<String, Integer> {
  public String marshal(Integer n) {
    return String.valueOf(n);
  }

  public Integer unmarshal(String val) {
    if(val == null) return null;
    else if("".equals(val)) return 0;
    else return Integer.valueOf(val);
  }
}

// likewise for DoubleZeroDefaultAdapter

使用するデフォルト値が空の文字列以外のものでない限り、名前またはニックネームのアダプターは必要ありません。文字列値のデフォルトでは、欠落要素は意味nullし、指定されたが空の要素は空の文字列を意味します。 、XML<nickname />では とまったく同じであることに注意して<nickname></nickname>ください。

于 2012-08-16T10:55:00.087 に答える
3
@XmlType(name = "person", propOrder = {"name", "age", "nickName" , "saldo"})
public class Person {

private String name;
private Integer age;
private String nickName;
private Integer id;
private Double saldo;

public Person(String name, Integer age, String nickName, Integer id, Double saldo) {
  this.name = name;
  this.age = age;
  this.nickName = nickName;
  this.id = id;
  this.saldo = saldo;
}

public Person() {
  //jaxb constructor
}

@XmlElement(defaultValue="0")
public Integer getAge() {
  return age;
}

@XmlTransient
public Integer getId() {
  return id;
}

@XmlElement(defaultValue="")
public String getName() {
  return name;
}

@XmlElement(name="nickname" , defaultValue="")
public String getNickName() {
 return nickName;
}

@XmlElement(defaultValue="0")
public Double getSaldo() {
  return saldo;
}

public void setAge(Integer age) {
  this.age = age;
}

public void setId(Integer id) {
  this.id = id;
}

public void setName(String name) {
  this.name = name;
}

public void setNickName(String nickName) {
  this.nickName = nickName;
}

public void setSaldo(Double saldo) {
  this.saldo = saldo;
}


}
于 2012-08-16T11:12:30.883 に答える
1

メンバーを宣言するときにデフォルト値でメンバーをインスタンス化する場合は、最初の問題を修正する必要があります。

試す:

public class Person{
 private String name = "";
 private Integer age = 0;
 private String nickName; = ""
 private Integer id = 0;
 private Double saldo =0.0;

hth、
mcalex

于 2012-08-16T10:00:18.267 に答える
0

私はcxf-codegen-pluginを使用していますが、(XSD / WSDLから開始して)できます

  1. データモデルのXSD内でデフォルト値を設定します(各タイプの「default」キーワード)
  2. プラグインのcxf-xjc-dv拡張機能を使用して、生成されたクラスのゲッターのデフォルト値を処理します。

これは、例えば、次のようにあなたのフィールド年齢へのゲッターを作成します:

public Integer getAge() {
   if (age == null)
      return new Interger(0);
   return age;
}
于 2012-08-16T10:08:21.087 に答える