2013-03-28 6 views
7

Ich habe eine einfache pojo kommentierte Klasse über JAXB so zuweisen:einfache Weise Standardwert mit XMLELEMENT Default Anmerkung

public class MyPojo 
    implements Serializable 
{ 

    private final static long serialVersionUID = 1234L; 
    @XmlElement(name = "Type", required = true, defaultValue = "none") 
    @NotNull 
    protected SeismicDataAcquisitionSystemType type; 
    @XmlElement(name = "IpAddress", required = true) 
    @NotNull 
    @Pattern(regexp = "((1?[0-9]?[0-9]|2[0-4]|[0-9]|25[0-5]).){3}(1?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])") 
    protected String ipAddress; 
    @XmlElement(name = "SealServerTcpPort", defaultValue = "1477") 
    @NotNull 
    protected int sealServerTcpPort; 
    @XmlElement(name = "PamServerTcpPort", defaultValue = "1485") 
    @NotNull 
    protected int pamServerTcpPort; 

    /** 
    * Obtient la valeur de la propriété type. 
    * 
    * @return 
    *  possible object is 
    *  {@link SeismicDataAcquisitionSystemType } 
    *  
    */ 
    public SeismicDataAcquisitionSystemType getType() { 
     return type; 
    } 

    /** 
    * Définit la valeur de la propriété type. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link SeismicDataAcquisitionSystemType } 
    *  
    */ 
    public void setType(SeismicDataAcquisitionSystemType value) { 
     this.type = value; 
    } 

    public boolean isSetType() { 
     return (this.type!= null); 
    } 

    /** 
    * Obtient la valeur de la propriété ipAddress. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public String getIpAddress() { 
     return ipAddress; 
    } 

    /** 
    * Définit la valeur de la propriété ipAddress. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setIpAddress(String value) { 
     this.ipAddress = value; 
    } 

    public boolean isSetIpAddress() { 
     return (this.ipAddress!= null); 
    } 

    /** 
    * Obtient la valeur de la propriété sealServerTcpPort. 
    * 
    */ 
    public int getSealServerTcpPort() { 
     return sealServerTcpPort; 
    } 

    /** 
    * Définit la valeur de la propriété sealServerTcpPort. 
    * 
    */ 
    public void setSealServerTcpPort(int value) { 
     this.sealServerTcpPort = value; 
    } 

    public boolean isSetSealServerTcpPort() { 
     return true; 
    } 

    /** 
    * Obtient la valeur de la propriété pamServerTcpPort. 
    * 
    */ 
    public int getPamServerTcpPort() { 
     return pamServerTcpPort; 
    } 

    /** 
    * Définit la valeur de la propriété pamServerTcpPort. 
    * 
    */ 
    public void setPamServerTcpPort(int value) { 
     this.pamServerTcpPort = value; 
    } 
} 

Ich versuche, meine pojo mit Standardwert zu initialisieren wie die

MyPojo myPojo = new MyPojo(); 
myPojo.getPamServerTcpPort(); // return 0 
setDefaultValues(myPojo); // assign attributes with annotated default values 
myPojo.getPamServerTcpPort(); // return 1485 

Ich versuche programmatisch mit der Methode setDefaultValues ​​(MyPojo loMyPojo), die Klasse mit java.lang.annotation API und java.lang.reflect API analysieren, aber mein Code ist hässlich und funktioniert nicht mit meinem eigenen Enumerate-Standardwert

Ich muss erwähnt, dass ich nicht original Klasse MyPojo ändern kann, weil sie sich durch XSD-Parsing über JAXB generiert

irgendeine Idee?

+0

welchem ​​Rahmen haben Sie die Klasse erzeugen verwenden (z Axiom 2)? – amphibient

+0

Ich verwende jaxb api mit xjc-Befehl un ein Plugin (krasa) –

Antwort

0

könnte eine schnelle Umsetzung Ihrer fehlenden Funktion wie folgt aussehen:

public static void setDefaultValues(Object o) throws Exception { 
     if (o == null) 
      return; 
     for (Class<?> clazz = o.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) { 
      for (final Field f : clazz.getDeclaredFields()) { 
       final XmlElement xe = f.getAnnotation(XmlElement.class); 
       if (xe != null && xe.defaultValue() != null) { 
        final Class<?> t = f.getType(); 
        if (t.isAssignableFrom(String.class)) { 
         f.setAccessible(true); 
         f.set(o, xe.defaultValue()); 
        } else if (t.isAssignableFrom(Integer.class) || clazz.getSimpleName().equals("int")) { 
         f.setAccessible(true); 
         f.set(o, Integer.parseInt(xe.defaultValue())); 
        } else if (t.isAssignableFrom(Long.class) || clazz.getSimpleName().equals("long")) { 
         f.setAccessible(true); 
         f.set(o, Long.parseLong(xe.defaultValue())); 
        } 
        // else { 
        // TODO: add futher conversions 
        // } 
       } 
      } 
     } 
    }