java – 使用xmlelement defaultvalue注释指定默认值的简单方法

我通过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
                    // }
                }
            }
        }
    }

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...