4

我用 Java 创建了一个 Web 服务JAX-WS。这是一个简单的,只返回 a 的大写版本String

@WebService(endpointInterface = "mod2.Mod2")
public class Mod2Impl implements Mod2 {

    @Override
    public String mod2(String x) {

        return x.toUpperCase();

    }
}

及其界面:

@WebService
public interface Mod2 {

    @WebMethod
    String mod2(String x);

}

JAX 为我生成了带有相关类的 mod2.jaxws 包。响应是这样的:

@XmlRootElement(name = "mod2Response", namespace = "http://mod2/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "mod2Response", namespace = "http://mod2/")
public class Mod2Response {

    @XmlElement(name = "return", namespace = "")
    private String _return;

    /**
     * 
     * @return
     *     returns String
     */
    public String getReturn() {
        return this._return;
    }

    /**
     * 
     * @param _return
     *     the value for the _return property
     */
    public void setReturn(String _return) {
        this._return = _return;
    }

}

部署后,它会生成正确的WSDL文件并导入XSD. 这是XSD

<xs:schema xmlns:tns="http://mod2/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://mod2/">
    <xs:element name="mod2" type="tns:mod2"/>
    <xs:element name="mod2Response" type="tns:mod2Response"/>
    <xs:complexType name="mod2">
        <xs:sequence>
            <xs:element name="arg0" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="mod2Response">
        <xs:sequence>
            <xs:element name="return" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

现在,我想要的是将 XSD 中名为“return”的元素更改为我想要的任何内容。我尝试更改@XmlElement(name = "return", namespace = "")Mod2Response 类中的 ,但这会引发以下错误:

GRAVE: WSSERVLET11: failed to parse runtime descriptor: javax.xml.ws.WebServiceException: class mod2.jaxws.Mod2Response do not have a property of the name return

为了实现这一目标,我必须改变什么?

4

2 回答 2

9

我在这里找到了答案。

我添加@WebResult(name="mod2Result")到我的界面:

@WebService
public interface Mod2 {

    @WebMethod
    @WebResult(name="mod2Result")
    String mod2(String x);

}

然后wsgen再次运行。这产生了以下响应:

@XmlRootElement(name = "mod2Response", namespace = "http://mod2/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "mod2Response", namespace = "http://mod2/")
public class Mod2Response {

    @XmlElement(name = "mod2Result", namespace = "")
    private String mod2Result;

    /**
     * 
     * @return
     *     returns String
     */
    public String getMod2Result() {
        return this.mod2Result;
    }

    /**
     * 
     * @param mod2Result
     *     the value for the mod2Result property
     */
    public void setMod2Result(String mod2Result) {
        this.mod2Result = mod2Result;
    }

}

它也有@XmlElement(name = "mod2Result")Joshi 所说的,但它也改变了变量、setter 和 getter 的名称。我尝试在 Response 类中直接使用 @XmlElement ,但没有成功。

于 2013-05-14T08:31:32.367 回答
0
@WebService
public interface Mod2 {

@WebMethod
@XMLElement(name="returnChanged")
String mod2(String x);

}

您可以在您的 Web 服务中尝试此代码。这是一个伪代码。

于 2013-05-14T07:24:21.090 回答