- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个非常简单的方法,我通过 JAX-WS 注释在 WS API 中使用它:
@WebMethod
public MyResponse sendSingle2(
@WebParam(name="username") String username,
@WebParam(name="password") String password,
@WebParam(name="newParam") String newParam) {
// the code
}
现在我希望 newParam 是可选的。我的意思是我希望该方法不仅在传递的 xml 中的参数为空时仍然有效:
<ws:sendSingle2>
<username>user</username>
<password>pass</password>
<newParam></newParam>
</ws:sendSingle2>
而且当它不存在时:
<ws:sendSingle2>
<username>user</username>
<password>pass</password>
</ws:sendSingle2>
我需要它不破坏现有的 API,它可以在没有新参数的情况下工作。
最佳答案
@WebParam 将消息部分映射到参数,部分不能是可选的。参见 Optional Message Parts in WSDL .因此,简短的回答是,您所要求的正是无法完成的。但是,如果您可以重构此方法,则可以使用下述方法之一。
通常参数的可选性是通过模式 minOccurs=0
设置的。此外,您可以在架构中定义一个请求参数,而不是使用多个参数,您将其定义为 WebMethod
的参数。可选性现在封装在参数中,无论是否带有可选参数,都会调用相同的方法。
我更喜欢先定义契约,而不是依赖自动生成的文件。一旦您了解了 XSD、SOAP 和 WSDL 如何协同工作,您几乎不想再使用基于注释/代码优先的定义,因为反过来您会更加灵活。
代码示例:
<xs:schema
targetNamespace="http://your.namespace.com"
xmlns:tns="http://your.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFromDefault="qualified"
attributeFromDefault="qualified">
...
<xs:element name="MyRequest" type="tns:MyRequestType" />
<xs:element name="MyResponse" type="tns:MyResponseType" />
<xs:complexType name"MyRequestType">
<xs:sequence>
<xs:element name="username" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="password" type="xs:string" minOccurs="1" maxOccurs="1" />
<xs:element name="newParam" type="xs:string" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
...
</xs:schema>
在您的 WSDL 文件中,您可以像这样定义消息:
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:msg="http://your.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
targetNamespace="http://your.namespace.com">
<wsdl:types>
<xs:schema>
<!-- either import the externalized schema -->
<xs:import namespace="http://your.namespace.com"
schemaLocation="someDir/yourMessageSchema.xsd" />
</xs:schema>
<!-- or define the schema within the WSDL - just copy the schema here -->
<xs:schema
targetNamespace="http://your.namespace.com"
xmlns:tns="http://your.namespace.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFromDefault="qualified"
attributeFromDefault="qualified">
...
</xs:schema>
</wsdl:types>
...
<wsdl:message name="sendSingle2Request">
<wsdl:part name="in" element="msg:MyRequest" />
</wsdl:message>
<wsdl:message name="sendSingle2Response">
<wsdl:part name="out" element="msg:MyResponse" />
</wsdl:message>
...
<wsdl:portType name="YourServiceEndpoint">
<wsdl:operation name="sendSingle2">
<wsdl:input message="tns:sendSingle2Request" />
<wsdl:output message="tns:sendSingle2Response" />
</wsdl:operation>
...
</wsdl:portType>
<wsdl:binding name="YourServiceBinding" type="YourServiceEndpoint">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name=""sendSingle2">
<soap:operation soapAction="http://your.namespace.com/SendSingle2" style="document" />
<wsdl:input>
<soap:body parts="in" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body parts="out" use="literal" />
</wsdl:output>
</wsdl:operation>
...
</wsdl:binding>
<wsdl:service name="YourService">
<wsdl:port name="YourServicePort binding="tns:YourServiceBinding">
<soap:address location="http://your.server:port/path/to/the/service" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
此处的 WSDL 契约(Contract)定义使用样式:document/literal
并且在模式的帮助下,实际的 SOAP 消息将被document/literal wrapped
,这也是 WS -我顺从。
因此你的方法将更改为 public MyResponse sendSinge2(MyRequest request)
其中 request
现在封装了 username
, passowrd
和 newParam
。如果 newParam
没有随 SOAP 请求一起发送,它只会返回 null
,因此最好在使用它之前先检查一下。
如果您坚持代码优先的方法,您将需要首先定义您的 MyRequest
类,您将其用作请求参数而不是那些 2 或 3 个值。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "MyRequest", namespace="http://your.namespace.com")
public class MyRequest implements Serializable
{
@XmlElement(name = "username", required = true)
protected String username;
@XmlElement(name = "password", required = true)
protected String password;
@XmlElement(name = "newParam", required = false)
protected String newParam;
...
}
如果您还没有为 MyResult
做同样的事情。 Web 方法现在可能看起来像这样:
@WebMethod(operationName = "sendSingle2")
@WebResult(name = "sendSingle2Response", targetNamespace = "http://your.namespace.com")
public MyResult sendSingle2(@WebParam(name = "sendSingle2Request") MyRequest request)
{
...
}
同样,request
封装了 3 个参数,您应该首先检查可选参数是否为 null。
HTH
关于java - SOAP WS - 使@WebParam 可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21179098/
我正在研究 WSDL 和 JAX-WS,这就是我遇到这个问题的地方。当我在 JAX-WS 中编写服务接口(interface)时,如下所示: @WebService @SOAPBinding(styl
我使用 JAX-WS RI(默认 Java 实现)建立了一个简单的 Web 服务。 我阅读了很多教程,发现 Web 方法的参数是用 WebParam 注释声明的。例如: @WebMethod void
是否可以将枚举传递为 @WebParam在 SOAP网络服务? @XmlEnum public enum TestEnum { TEST; } @WebService public class
我在 web 服务中有一个方法,具有以下签名: @WebResult(name="purchaseId") public int CreatePurchase( @XmlEle
我有一个像这样定义的 Java JWS WebService: @WebService public class Foo { @WebMethod public int foo(@We
我尝试获取接口(interface)方法中方法参数User user 上注释@WebParam 的名称“best_user”。因为它是一个接口(interface),所以以下代码不允许我访问注释: S
我正在尝试使用 (@XmlElement(required=true) 让我的 @webparam 成为强制性的,但生成的 XSD 仍然显示为 minOccurs="0 "。还尝试设置 nillabl
@WebService public interface MyService { public void doStuff( @WebParam(name = "someObjectList") L
我有一个非常简单的方法,我通过 JAX-WS 注释在 WS API 中使用它: @WebMethod public MyResponse sendSingle2( @WebParam(name
我们正在将 JAX-WS 与 JAXB (2.1) 结合使用。 首先,我们创建了链接到 XSD 类型的 Java 类。 然后,使用 CXF (2.1.3)、Spring (2.0.8) 和 JAX-W
我有一个通过 Jetty 公开 SOAP API 的 Java 应用程序。我可以成功访问 WSDL 并伪造请求,但发送的 webparam 始终为空。我不知道如何调试这个问题。这里我有一些请求中涉及的
我已经使用 wsdl2java 生成了代码,它可以与默认的 Java JAX-WS 实现一起正常工作。当我添加 CXF 时,我的应用程序停止工作。我知道这是因为切换 JAX-WS 实现( Why ws
我一直在努力为这个特定主题寻找解决方案: 可以在@webParam 注释中为基于 SOAP/WSDL 的 Web 服务定义默认值吗?我想要的正是下面的结果: 我的 Web 服务中有一个名为 getCu
我有一个带有 Web 方法的 jax-ws Web 服务: @WebMethod void SetCurrentDate(Date date) 在生成的 wsdl 参数中,日期的类型为 xs:date
我正在使用 JAX-WS 构建 Web 服务。我有一个奇怪的问题,即 @WebParam 的注释 @XmlElement(required=true) 在某些 @WebService 类中工作,但没有
我使用 @WebService、@WebMethod 和 @WebParam 注释从 Java 类生成 WSDL。 WSDL 已生成,并包含 @WebService 和 @WebMethod 的输出,
这是我生成 wsdl 的 java 代码: @WebMethod(action = "sendRequest") @WebResult(partName= "message") public Stri
我正在尝试使用 Java 11 中的 wsimport 工具。 我从 Eclipse EE4J 的 Metro 项目获得了 jax-ws 的开源版本,地址为 https://github.com/ec
我正在尝试使用 JBossWS 3.1.2 开发一个 Web 服务,该服务将 HashMap 作为其参数之一。我正在使用这个版本的 JBossWS,因为它是随我正在使用的 JBoss 版本一起分发的。
我在 wsdl 上使用 wsdl2java 生成了类,服务接口(interface)如下所示 @WebService(targetNamespace = "http://www.sii.example
我是一名优秀的程序员,十分优秀!