Java – an easy way to specify a default value using the xmlelement DefaultValue annotation

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
分享
二维码
< <上一篇
下一篇>>