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)
首先编写简单的转换器(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,请与我们分享.
您必须直接注释参数,如下所示(我正在使用 @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)