Java – an easy way to specify a default value using the xmlelement DefaultValue annotation
•
Java
I have a simple POJO annotation class through JAXB:
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; } }
I try to initialize my POJO with default values like that
MyPojo myPojo = new MyPojo(); myPojo.getPamServerTcpPort(); // return 0 setDefaultValues(myPojo); // assign attributes with annotated default values myPojo.getPamServerTcpPort(); // return 1485
I'm trying programmatically with the method setdefaultvalues (mypojo lomypojo), which uses Java Lang.annotation API and Java The lang.reflect API parses classes, but my code is ugly and can't use my own enumeration defaults
I have to mention that I can't modify the original class mypojo because it is generated by parsing XSD through Jax
Any ideas?
Solution
Quick implementation of missing functions may be as follows:
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 // } } } } }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码