【问题标题】:How can I send an abstract argument to a web service?如何将抽象参数发送到 Web 服务?
【发布时间】:2011-06-01 09:22:01
【问题描述】:

我想在 web 服务方法中发送一个抽象对象作为参数。

这些是我的课程: 抽象类:

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

【问题讨论】:

  • 既然“Person”既可以是男性也可以是女性,那么在 Person 上定义一个“gender”属性不是更好吗,您可以在相应的子类的构造函数中将其设置为男性或女性?这样一来,所有的 Person 都有一个可测试的性别?

标签: web-services soap xml-serialization cxf abstract


【解决方案1】:

老实说,我很惊讶 JAXB 在启动时没有抛出异常。您有两种类型定义了相同的 XmlRootElement。

你应该做的是在类上有@XmlType(name="Male")、@XmlType(name="Female")、@XmlType(name="Person)。这将正确设置类型层次结构。我不会在其中任何一个上放置 XmlRootElement。让 CXF 根据 @WebParam 等来处理。

【讨论】:

  • 我已删除 XmlRootElements 并按照您的建议将 XmlTypes 全部放在它们上。 1. 但是客户端不发送任何男性/女性信息,它只发送姓名(因为“Person”父级中只有“姓名”信息)。 (我使用 tcp 代理来查看客户端实时发送的内容) 2. 服务器没有得到任何有用的信息 - 只有空值。我的意思是方法:@Override public String getIsMale(Person person) { return person.getName();引发 NullPointerException。你有什么线索可以帮助解决我的两个问题吗?
  • 老实说,我不知道。可能需要查看完整的测试用例。您也可以尝试将 XmlSeeAlso 注释添加到 wsTest 接口。我不确定这是否会有所帮助。听起来客户真的不知道子类。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
相关资源
最近更新 更多