我通过JAXB有一个简单的pojo注释类:
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)尝试programmaticaly,该方法使用java.lang.annotation API和java.lang.reflect API解析类,但我的代码很难看,并且不能使用我自己的枚举默认值
我不得不提到我无法修改原始类MyPojo,因为它本身是通过JAX解析XSD而生成的
任何的想法?
解决方法
快速实现缺少的功能可能如下所示:
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 // } } } } }