JAX-WS和Joda-Time?

jax*_*zin 13 java soap jax-ws jodatime

如何编写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
    );

}
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 9

首先编写简单的转换器(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);
    }

}
Run Code Online (Sandbox Code Playgroud)

接下来,您必须将转换器引入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>
Run Code Online (Sandbox Code Playgroud)

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

@XmlJavaTypeAdapter(Adapter2.class)
@XmlSchemaType(name = "date")
protected Calendar date;
Run Code Online (Sandbox Code Playgroud)

Adapter2.class生成的适配器在哪里包装您的POJO转换器.你可以看到Calendar使用而不是笨拙javax.xml.datatype.XMLGregorianCalendar.如果您将此示例调整为Joda-Time,请与我们分享.


dul*_*lon 3

您必须直接注释参数,如下所示(我正在使用 @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
    );
}
Run Code Online (Sandbox Code Playgroud)