我有一个在操作参数中使用不可变类的web服务(这是因为其他开发人员正在处理项目) - 这意味着没有公共设置者。没有公共设置者意味着web服务不会看到属性。
我们的想法是创建私有的setter并将init
注释为PostConstruct
的方法添加到我的webservice类中。在init
方法中,所有私有设置器都可以通过反射进行设置。
问题是在部署时根本没有调用用init
注释的PostConstruct
方法。我正在使用JAX-WS并将项目部署到Glassfish。
答案 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。