2013-03-14 14 views
9

Ich bin neu bei JAXB und habe Probleme mit der Konvertierung von XML in eine Java-Klasseninstanz.JAXB @ XmlAttribute @ XmlValue reales Beispiel

Ich habe die folgende XML:

<?xml version="1.0"?> 
<response> 
    <category>client</category> 
    <action>Greeting</action> 
    <code>1000</code> 
    <msg>Your Connection with API Server is Successful</msg> 
    <resData> 
     <data name="svDate">2009-02-16 06:22:21</data> 
    </resData> 
</response> 

und entwickle ich den folgenden Java-Code:

/** 
* Copyright 2013. ABN Software. All Rights reserved.<br> 
* Author ...... Andre<br> 
* Created ..... 14.03.2013<br> 
* <br> 
*/ 
package net.regmaster.onlinenic.model; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementRef; 
import javax.xml.bind.annotation.XmlRootElement; 

import net.regmaster.onlinenic.enumtype.OnicEnumAction; 
import net.regmaster.onlinenic.enumtype.OnicEnumCategory; 
import net.regmaster.onlinenic.model.resdata.GreetingResData; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

/** 
* @author annik 
* 
*/ 
@XmlRootElement(name = "response") 
// @XmlType(propOrder = { "category", "action", "code", "message"}) 
public class OnicGreeting 
{ 
    private OnicEnumCategory category; 
    private OnicEnumAction action; 
    private Integer   code; 
    private String   message; 
    private GreetingResData resData; 
    // 
    private Logger   LOG = LoggerFactory.getLogger(getClass()); 

    /** 
    * Getter. 
    * 
    * @return the category 
    */ 
    public OnicEnumCategory getCategory() { 
     return category; 
    } 

    /** 
    * Setter. 
    * 
    * @param category 
    *   the category to set 
    */ 
    public void setCategoryEnum(OnicEnumCategory category) { 
     this.category = category; 
    } 

    @XmlElement 
    public void setCategory(String category) { 
     try { 
      this.category = OnicEnumCategory.getEnum(category); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      LOG.error(e.getMessage()); 
     } 
    } 

    /** 
    * Getter. 
    * 
    * @return the action 
    */ 
    public OnicEnumAction getAction() { 
     return action; 
    } 

    /** 
    * Setter. 
    * 
    * @param action 
    *   the action to set 
    */ 
    public void setActionEnum(OnicEnumAction action) { 
     this.action = action; 
    } 
    @XmlElement 
    public void setAction(String action) { 
     try { 
      this.action = OnicEnumAction.getEnum(action); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      LOG.error(e.getMessage()); 
     } 
    } 

    /** 
    * Getter. 
    * 
    * @return the code 
    */ 
    @XmlElement 
    public Integer getCode() { 
     return code; 
    } 

    /** 
    * Setter. 
    * 
    * @param code 
    *   the code to set 
    */ 
    public void setCode(Integer code) { 
     this.code = code; 
    } 

    /** 
    * Getter. 
    * 
    * @return the message 
    */ 
    @XmlElement(name = "msg") 
    public String getMessage() { 
     return message; 
    } 

    /** 
    * Setter. 
    * 
    * @param message 
    *   the message to set 
    */ 
    public void setMessage(String message) { 
     this.message = message; 
    } 

    /** 
    * Getter. 
    * 
    * @return the resData 
    */ 
    @XmlElementRef 
    public GreetingResData getResData() { 
     return resData; 
    } 

    /** 
    * Setter. 
    * 
    * @param resData 
    *   the resData to set 
    */ 
    public void setResData(GreetingResData resData) { 
     this.resData = resData; 
    } 

    @Override 
    public String toString() { 
     return "category=" + category + ", action=" + action + ", code=" + code + ", msg=" + message 
       + ", resData:" + resData.toString(); 
    } 
} 

und

/** 
* Copyright 2013. ABN Software. All Rights reserved.<br> 
* Author ...... Andre<br> 
* Created ..... 14.03.2013<br> 
* <br> 
*/ 
package net.regmaster.onlinenic.model.resdata; 

import java.util.Calendar; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.XmlValue; 

/** 
* @author annik 
* 
*/ 
@XmlRootElement(name="resData") 
public class GreetingResData extends AbstractResData 
{ 
    String svDate; 

    /** 
    * Constructor. 
    * 
    */ 
    public GreetingResData() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * Getter. 
    * 
    * @return the svDate 
    */ 
    @XmlAttribute 
    public String getSvDate() { 
     return svDate; 
    } 

    /** 
    * Setter. 
    * 
    * @param svDate 
    *   the svDate to set 
    */ 
    public void setSvDate(String svDate) { 
     this.svDate = svDate; 
    } 
} 

Diese Codebeispiele laufen, aber Daten ist falsch:

http://i.stack.imgur.com/qCCIM.png

Bitte helfen Sie mir.

Auch verstehe ich nicht, für den Fall, werde ich viele verschiedene haben

<data ...>..</data> 

Was könnte ich tun einfach und einfach?
Ich meine diesen Fall:

<resData> 
<data name="crDate">2004-12-17</data> 
<data name="exDate">2009-01-02</data> 
<data name="password">7fe11fd9d97ee40bdf57e561427c0a6</data> 
<data name="dns">dns1.onlinenic.net</data> 
<data name="dns">dns2.onlinenic.net</data> 
<data name="r_name">123456</data> 
<data name="r_org">123456</data> 
<data name="r_country">BJ</data> 
<data name="r_province">mokcup</data> 
<data name="r_city">123456</data> 
<data name="r_street">123456</data> 
<data name="r_postalcode">123456</data> 
<data name="r_voice">+86.5925391800</data> 
<data name="r_fax">+86.5925391800</data> 
<data name="r_email">[email protected]</data> 
.... 
+0

Das folgende Beispiel helfen können: https://github.com/bdoughan/blog20110322 –

Antwort

9

Danke Blaise Doughan. Aber nachdem mehr über 10 Themen gegraben habe, entscheide ich, dass ich mit dem umgekehrten Weg anfangen musste.

Ich erstellte einen neuen Test, der meine Daten MARSHALLING (Objekte). Eigentlich habe ich TDD (test Driven Development) benutzt, denke ich. Also, ich füllte meine Objekte mit Testdaten und angewendet Marshalling (erstellt XML von DATA) und sah, dass ich bekam. Daten waren falsch. Ich sah auch zu anderen Thema (thanx diese Java/JAXB: Unmarshall Xml to specific subclass based on an attribute) und meine Daten Aufbau

korrigieren erinnern Id

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<response> 
    <code>1000</code> 
    <message>Big message</message> 
    <resData> 
     <data name="svDate">2013.03.14</data> 
    </resData> 
</response> 

Nun meine Daten zu bekommen:

package net.regmaster.onlinenic.model.response.resdata; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlValue; 

import org.eclipse.persistence.oxm.annotations.XmlCustomizer; 

/** 
* @author annik 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="data") 
//@XmlCustomizer(ResDataCustomiser.class) 
public class XmlData 
{ 
    @XmlAttribute(name="name") 
    private String name; 

    @XmlValue 
    private String value; 

    /** Getter. 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** Setter. 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** Getter. 
    * @return the value 
    */ 
    public String getValue() { 
     return value; 
    } 

    /** Setter. 
    * @param value the value to set 
    */ 
    public void setValue(String value) { 
     this.value = value; 
    } 
} 

und:

package net.regmaster.onlinenic.model.response.resdata; 

import java.util.List; 

import javax.xml.bind.annotation.XmlRootElement; 

/** 
* @author annik 
* 
*/ 
@XmlRootElement 
public class ResData 
{ 
    private List<XmlData> data; 

    /** 
    * Getter. 
    * 
    * @return the data 
    */ 
    public List<XmlData> getData() { 
     return data; 
    } 

    /** 
    * Setter. 
    * 
    * @param data 
    *   the data to set 
    */ 
    public void setData(List<XmlData> data) { 
     this.data = data; 
    } 
} 

und:

package net.regmaster.onlinenic.model.response; 

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElements; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlTransient; 
import javax.xml.bind.annotation.XmlType; 

import net.regmaster.onlinenic.enumtype.OnicEnumAction; 
import net.regmaster.onlinenic.enumtype.OnicEnumCategory; 
import net.regmaster.onlinenic.model.response.resdata.ResData; 
import net.regmaster.onlinenic.model.response.resdata.XmlData; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

/** 
* @author annik 
* 
*/ 
@XmlRootElement(name = "response") 
//@XmlType(propOrder = { "category", "action", "code", "message"}) 
public class OnicGreetingResponse 
{ 
    private OnicEnumCategory category; 
    private OnicEnumAction action; 
    private Integer   code; 
    private String   message; 

// private GreetingResData resData; 
    private ResData resData; 

    // 
    @XmlTransient 
    private Logger   LOG = LoggerFactory.getLogger(getClass()); 

    /** 
    * Getter. 
    * 
    * @return the category 
    */ 
    public OnicEnumCategory getCategory() { 
     return category; 
    } 

    /** 
    * Setter. 
    * 
    * @param category 
    *   the category to set 
    */ 
    public void setCategoryEnum(OnicEnumCategory category) { 
     this.category = category; 
    } 

    @XmlElement 
    public void setCategory(String category) { 
     try { 
      this.category = OnicEnumCategory.getEnum(category); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      LOG.error(e.getMessage()); 
     } 
    } 

    /** 
    * Getter. 
    * 
    * @return the action 
    */ 
    public OnicEnumAction getAction() { 
     return action; 
    } 

    /** 
    * Setter. 
    * 
    * @param action 
    *   the action to set 
    */ 
    public void setActionEnum(OnicEnumAction action) { 
     this.action = action; 
    } 
    @XmlElement 
    public void setAction(String action) { 
     try { 
      this.action = OnicEnumAction.getEnum(action); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      LOG.error(e.getMessage()); 
     } 
    } 

    /** 
    * Getter. 
    * 
    * @return the code 
    */ 
    @XmlElement 
    public Integer getCode() { 
     return code; 
    } 

    /** 
    * Setter. 
    * 
    * @param code 
    *   the code to set 
    */ 
    public void setCode(Integer code) { 
     this.code = code; 
    } 

    /** 
    * Getter. 
    * 
    * @return the message 
    */ 
    @XmlElements(value={@XmlElement}) 
    public String getMessage() { 
     return message; 
    } 

    /** 
    * Setter. 
    * 
    * @param message 
    *   the message to set 
    */ 
    public void setMessage(String message) { 
     this.message = message; 
    } 

    /** Getter. 
    * @return the resData 
    */ 
    public ResData getResData() { 
     return resData; 
    } 

    /** Setter. 
    * @param resData the resData to set 
    */ 
    @XmlElement 
    public void setResData(ResData resData) { 
     this.resData = resData; 
    } 

    @Override 
    public String toString() { 
     return "category=" + category + ", action=" + action + ", code=" + code + ", msg=" + message 
       + ", resData:" + resData.toString(); 
    } 
} 

und vu-alja: Ich habe das!

Und wie Sie unten sehen können es auf eine andere Art und Weise funktioniert: http://i.stack.imgur.com/35nzb.png