如何编写一个 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/