java - JAX-WS 和 Joda-Time?

标签 java soap jax-ws jodatime

如何编写一个 JAX-WS 服务,使我的 @WebMethod 的 @WebParam 是一个像 DateTime 这样的 Joda-Time 类?参数上的 @XmlTypeAdapter 会起作用吗?我正在部署到 GlassFish 2.1。

让我澄清一下这个问题,因为到目前为止,这两个答案都侧重于将自定义类型绑定(bind)到现有的 JAXB 类,这是相关的,但不是我要问的问题。如何使以下 @WebService 接受 joda DateTime 对象作为参数?

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import org.joda.time.DateTime;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Resender {
    @WebMethod
    void resend(
            @WebParam(name = "start") DateTime start,
            @WebParam(name = "end") DateTime end
    );

}

最佳答案

首先编写简单的转换器(在本例中为 Calendar,但可以轻松更改为 Joda-Time):

public class XsdDateTimeConverter {

    public static Calendar unmarshal(String dateTime) {
        final GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(DatatypeConverter.parseDate(dateTime).getTime());
        return calendar;
    }

    public static String marshal(Calendar calendar) {
        return DatatypeConverter.printDate(calendar);
    }

}

接下来,您必须将转换器引入 JAXB(xjb 文件):

<globalBindings>

    <javaType
            name="java.util.Calendar"
            xmlType="xs:dateTime"
            parseMethod="XsdDateTimeConverter.unmarshal"
            printMethod="XsdDateTimeConverter.marshal"
            />
    <javaType
            name="java.util.Calendar"
            xmlType="xs:date"
            parseMethod="XsdDateTimeConverter.unmarshal"
            printMethod="XsdDateTimeConverter.marshal"
            />
</globalBindings>

在生成的 JAXB 模型中 xjc 生成了以下注释:

@XmlJavaTypeAdapter(Adapter2.class)
@XmlSchemaType(name = "date")
protected Calendar date;

其中 Adapter2.class 是一个生成的适配器,它包装了您的 POJO 转换器。如您所见,使用了 Calendar 而不是笨拙的 javax.xml.datatype.XMLGregorianCalendar。如果您将此示例调整为 Joda-Time,请与我们分享。

关于java - JAX-WS 和 Joda-Time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5106987/

相关文章:

soap - 连接失败时如何使用 WSS4JOutInterceptor 在 CXF 中捕获 SOAP 请求消息

java - tomcat5上的应用程序无法启动

java - 如何获取我的 WSDL 的 URL?

java - ListView 上的可点击图像

java - 反射(reflection)命令的坏习惯或好习惯

java - 无法从我的桌面连接到 ec2 上的 rabbitmq

java - 如何使用替换/正则表达式替换字符串中的两个字符?

Python UTF-8 XML 解析 (SUDS) : Removing 'invalid token'

web-services - 让 REST 与 SOAP 通信

intellij-idea - 如何从 Intellij IDEA 为 JAX-WS 提供 "wsimport"参数