【问题标题】:Creating a web service with complex types创建具有复杂类型的 Web 服务
【发布时间】:2013-05-07 11:46:26
【问题描述】:

我是 Web 服务的新手,我在 Eclipse 中使用一种公开的方法创建了一个基本项目。我能够部署我的网络服务并且它工作正常。代码如下。

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(targetNamespace="http://test.com", name="testService")
public class WebService {
    @WebMethod(operationName="start")
    public String start(@WebParam(name="inputParameter") String inputParameter) {
        return startMethod(inputParameter);
    }
}

我的问题是如何设置这种方法来处理复杂类型。我想接收一些参数,但我不想只是将它们作为一堆字符串接收。我正在考虑使用某种包装器对象,其中包含我的方法所需的所有参数。关于如何做到这一点的任何建议?我是否需要额外的注释来创建 WSDL?谢谢!

【问题讨论】:

    标签: java web-services jax-ws


    【解决方案1】:

    JAX-WS 基于 JAXB,因此您只能将 JAXB 支持的类型作为 Web 方法参数传递。因此,如下所述的任何用户定义的正确注释的类都可以用作任何 WebMethod 的参数或返回类型

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Person")
    public class Person {    
        @XmlElement(name = "firstName")
        protected String firstName;    
        @XmlElement(name = "lastName")
        protected String lastName;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String value) {
            this.firstName = value;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String value) {
            this.lastName = value;
        }
    }
    

    【讨论】:

      【解决方案2】:

      首先,设置 Web 服务调用或响应在 WSDL 中包含哪些复杂类型

      <xsd:element name="AWebServiceElementName">
                      <xsd:complexType>
                          <xsd:sequence>
                              <xsd:element maxOccurs="1" minOccurs="1" name="header" type="tns:ReplyHeader"/>
                              <xsd:element maxOccurs="1" minOccurs="1" name="body">
                                  <xsd:complexType>
                                      <xsd:sequence>
                                          <xsd:element maxOccurs="unbounded" minOccurs="0" name="acomplextype" type="tns:acomplextype"/>
                                          <xsd:element maxOccurs="1" minOccurs="1" name="anothercomplextype" type="tns:anothercomplextype"/>
                                      </xsd:sequence>
                                  </xsd:complexType>
                              </xsd:element>
                          </xsd:sequence>
                      </xsd:complexType>
                  </xsd:element>
      

      然后定义您的复杂类型包含的内容:

              <xsd:complexType name="acomplextype">
                  <xsd:sequence>
                      <xsd:element maxOccurs="1" minOccurs="1" name="somefieldid" type="xsd:long"/>
                      <xsd:element maxOccurs="1" minOccurs="1" name="somestring" type="xsd:string"/>
                  </xsd:sequence>
              </xsd:complexType>
              <xsd:complexType name="anothercomplextype">
                  <xsd:sequence>
                      <xsd:element maxOccurs="1" minOccurs="1" name="somefieldid" type="xsd:long"/>
                      <xsd:element maxOccurs="1" minOccurs="1" name="somestring" type="xsd:string"/>
                  </xsd:sequence>
              </xsd:complexType>
      

      在 Java 端,您需要一个包装类,其中包含这些带有 getter 和 setter 的字段

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 2020-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多