我有一个这样的类:
import java.util.List;
import java.util.String;
import javax.xml.bind.annotation.XmlType;
@XmlType
public class Foo {
private List<Foo> compound;
private String bar;
// private method used internally to know
// if this is a compound instance
private boolean isCompound() {
return compound != null && compound.size() != 0;
}
// public setter for compound instance var
public void setCompound(List<Foo> compound) {
this.compound = compound;
}
// public getter for compound instance var
public List<Foo> getCompound() {
return compound;
}
public void setBar(String bar) {
this.bar = bar;
}
public String getBar() {
return bar;
}
}
在正常使用中,这个类的行为正如您所期望的那样。方法getCompound
和setCompound
获取和设置复合列表。然而,我使用这个类作为在使用JAX-WS构建的web服务中传递的对象。当JAX-WS编译器看到这个类时,它会忽略setCompound
和getCompound
访问器,并且XSD中出现的唯一属性是bar
。
在用头撞墙了一天的大部分时间后,我决定尝试将私有方法isCompound
的名称更改为isACompound
,突然一切都如你所料。JAX-WS为compound
属性创建了正确的模式。
似乎正在发生的事情是,JAX-WS看到了isCompound
方法(即使它是私有的),并将其视为没有相应setter的getter,因此忽略了compound
的真正公共访问器。
Java Bean规范中是否有任何内容表明,不能使用私有is<Something>
方法,其中<something>
也是非布尔属性的名称,该属性也有自己的访问器?当然,任何在类上使用反射的东西都应该简单地忽略私有方法吗?
如果更改会发生什么:
return compound != null && compound.size() != 0;
//To:
private boolean isCompound() {
boolean check = false;
if(compound !=null && compound.size()!=0){
check = true;
}else{
check =false;
}
return check;
}
//or
@XmlAccessorType(XmlAccessType.NONE) on the class and @XmlElement and @XmlAttribute on the get/set methods.