Как я могу отправить абстрактный аргумент в веб-сервис? - PullRequest
1 голос
/ 01 июня 2011

Я хочу отправить абстрактный объект в качестве аргумента в методе веб-сервиса.

Это мои классы: Абстрактный класс:

@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   = 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]

1 Ответ

0 голосов
/ 02 июня 2011

Честно говоря, я удивлен, что JAXB не выдает исключение при запуске. У вас есть два типа, определяющих один и тот же XmlRootElement.

Что вы должны сделать, это иметь в классах @XmlType (name = "Male"), @XmlType (name = "Female"), @XmlType (name = "Person). Это правильно настроит иерархию TYPE. I не будет помещать XmlRootElement на любой из них. Пусть CXF обрабатывает это на основе @ WebParam и тому подобное.

...