java - 如何在 java web 服务中定义 @WebParam 的默认值?

标签 java web-services soap jaxb jax-ws

我一直在尝试为这个特定主题找到解决方案:

是否可以在基于 SOAP/WSDL 的 Web 服务的 @webParam 注释中定义默认值?我想要的正是以下结果:

我的 Web 服务中有一个名为 getCustomers 的 @WebMethod,其签名如下:

@WebMethod(operationName = "getCustomers")
@WebResult(name = "customer")
public Customer[] getCustomers(@WebParam(name = "company") String company,
       @WebParam(name = "limitTop") int limitTop){

       //Logic of getting customer be here

}

特别是,参数 limitTop 在此方法中不是可选的,该数字表示您希望响应返回多少客户记录,但我希望在我的 xml 架构中,此特定元素具有默认值值,像这样:

<xs:complexType name="getCustomers">
    <xs:sequence>
        <xs:element name="company" type="xs:string" minOccurs="0"/>
        **<xs:element name="limitTop" type="xs:int" default="100"/>**
    </xs:sequence>
</xs:complexType>

请注意名为limitTop的元素中的default属性

这是为了允许客户端应用程序发送不带 limitTop 元素的 SOAP 消息,但仍将返回的记录数限制为 limitTop 元素中给定的默认值。

我正在使用 Java、JAX-WS 和 GlassFish Server 开源版本。

感谢您的帮助。

卡洛·亚涅斯

最佳答案

您所追求的内容无法用您当前的网络服务风格来实现。首先,如果发送的原始消息中不存在该元素,JAXB 不会将默认值注入(inject)到消息中。来自 JAXB manual

element defaults do not kick in when the element is absent, so unfortunately we can't change this behavior.

作为解决方法,您可以将 Web 服务样式更改为 WRAPPED。使用这种样式,您可以将 Web 服务参数封装在单个父类型中(如果愿意,可以使用简单的 RequestWrapper)。鉴于这种灵活性,您的客户端可以提供一个可能包含也可能不包含这两个参数的父类型。你的包装应该类似于:

@XmlRootElement
public class YourWrapper {

 String company;

 @XmlElement(name="limitTop",required="false",defaultValue="100")
 int limitTop; 

//getters and setters
}

另外,

@RequestWrapper(targetNamespace="http://you.com/ws/types", className="com.you.YourWrapper") 
@WebMethod(operationName = "getCustomers")
@WebResult(name = "customer")
public Customer[] getCustomers(@WebParam(name = "company") String company,
       @WebParam(name = "limitTop") int limitTop){

       //Logic of getting customer be here

}

鉴于上述情况,JAXB 将能够忽略该值的缺失,并可能在解码之后设置默认值

关于java - 如何在 java web 服务中定义 @WebParam 的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441730/

相关文章:

java - bufferedreader 中缺少第一个字符

php - 在 PHP 中创建单例 Web 服务的最佳方法是什么?

web-services - 通过@OData.publish发布的CDS在/IWFND/MAINT_SERVICE中不可见

c# - 如何为 "Auth-Token"的 Web 服务添加 token 认证?

java - 如何解析 SAAJ(带附件的 SOAP 消息)中多部分/相关类型的附件部分?

java - DateFormat 未正确解析日期

java - jsp中如何获取session值

java - 使用 Java API 的增强现实应用程序

web-services - 使用 ColdFusion 创建安全的 Web 服务

c# - 客户关系管理 2013 : Getting Data from Organization Service with Microsoft. XRM