JAX-WS 和 Joda-Time?

2022-09-04 20:32:14

如何编写 JAX-WS 服务,以便我的@WebMethod@WebParam是像 DateTime 这样的 Joda-Time 类?参数上的@XmlTypeAdapter是否有效?我正在部署到GlassFish 2.1。

让我澄清一下这个问题,因为到目前为止,两个答案都集中在将自定义类型绑定到现有的 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
    );

}

答案 1

首先写入简单的转换器(在本例中为,但可以很容易地更改为Joda-Time):Calendar

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;

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


答案 2

您必须直接注释参数,如下所示(我正在使用@DennisTemper编写的XSDDateTimeMarshaller作为您问题的答案之一,但可以随意用另一个答案替换...) :

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

推荐