是否可以在创建webservice之前通过反射修改方法?

时间:2013-05-06 03:46:49

标签: java web-services reflection jaxb jax-ws

我有一个在操作参数中使用不可变类的web服务(这是因为其他开发人员正在处理项目) - 这意味着没有公共设置者。没有公共设置者意味着web服务不会看到属性。

我们的想法是创建私有的setter并将init注释为PostConstruct的方法添加到我的webservice类中。在init方法中,所有私有设置器都可以通过反射进行设置。

问题是在部署时根本没有调用用init注释的PostConstruct方法。我正在使用JAX-WS并将项目部署到Glassfish。

1 个答案:

答案 0 :(得分:1)

你想做的事听起来像是一个可怕的黑客。

如果我做对了,你的问题就是你的行为中用作参数的对象是不可变的。幸运的是,有很多方法可以使用注释自定义JAXB映射。应该可以保持您的类不可变,但使字段对JAXB可见。

this answer开始,我看到了:

package blog.immutable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.NONE)
public final class Customer {

    @XmlAttribute
    private final String name;

    @XmlElement
    private final Address address;

    @SuppressWarnings("unused")
    private Customer() {
        this(null, null);
    }

    public Customer(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

}

如果你不喜欢上面的代码需要一个no-arg构造函数Customer()的事实,你可以看看更多complicated approach