问题描述
|
我想将抽象对象作为webservice方法中的参数发送。
这些是我的课程:
抽象类:
@XmlSeeAlso({Male.class,Female.class})
public abstract class Person {
public String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
扩展的孩子:
@XmlRootElement(name = \"person\")
public class Male extends Person {
private boolean male;
/**
* @return the male
*/
public boolean isMale() {
return male;
}
/**
* @param male the male to set
*/
public void setMale(boolean male) {
this.male = male;
}
}
和
@XmlRootElement(name = \"person\")
public class Female extends Person{
private boolean female;
/**
* @return the female
*/
public boolean isFemale() {
return female;
}
/**
* @param female the female to set
*/
public void setFemale(boolean female) {
this.female = female;
}
}
这是我的网络服务界面:
@WebService
public interface wsTest {
@WebMethod
int getInt();
@WebMethod
String getString(String s);
@WebMethod
Map<String,String> getMap(Map<String,String> map);
@WebMethod
String getMaleStr(Male male);
@WebMethod
String getIsMale(@WebParam(name = \"param\")Person person);
}
我的问题是我想发送给webMethod:getIsMale一个类型为Male的对象,但肥皂消息不发送类型为Male的对象,因此按如下方式剥离其“ male”成员:
发送时的请求:
Male male = new Male();
male.name = \"Avi\";
male.setMale(true);
System.out.println(\"Calling: getIsMale...\");
System.out.println(\"Response is: \" + ws.getIsMale(male));
如下:
[?xml version=\"1.0\" standalone=\"yes\"?]
[soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"]
[soap:Body]
[ns1:getIsMale xmlns:ns1=\"http://ws.xconnect.com/\"]
[ns1:param]
[ns2:name xmlns:ns2=\"http://ws.xconnect.com\"]Avi[/ns2:name]
[/ns1:param]
[/ns1:getIsMale]
[/soap:Body]
[/soap:Envelope]
解决方法
老实说,我很惊讶JAXB在启动时没有抛出异常。您有两种类型定义相同的XmlRootElement。
您应该做的是在类上使用@XmlType(name = \“ Male \”),@XmlType(name = \“ Female \”),@XmlType(name = \“ Person)。这将正确设置TYPE层次结构我不会在其中任何一个上放置XmlRootElement,让CXF根据@WebParam等来处理它。