2013-03-28 88 views
7

我必須通過JAXB這樣一個簡單的POJO註解類:簡單的方式來分配與XMLELEMENT默認值註釋默認值

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; 
    } 
} 

我嘗試初始化我的POJO就是那樣的

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

我想用setDefaultValues(MyPojo loMyPojo)方法來解析類,它使用java.lang.annotation API和java.lang.reflect API解析類,但是我的代碼很難看,並且不能用我自己的枚舉默認值

我必須mentionned因爲它本身由XSD解析通過JAXB

任何想法產生我不能修改原始類MyPojo?

+0

你用什麼框架生成類(如公理2)? – amphibient

+0

我使用jaxb api和xjc命令un a plugin(krasa) –

回答

0

的快速實現您丟失功能的可能看起來像:

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 
        // } 
       } 
      } 
     } 
    }