我必须通过jax-ws公开ejb服务层。
我使用jax-ws和wsimport生成了Web服务但是我被一些奇怪的东西拦住了;日期被映射到XmlGregorianCalendar。 是否可以使用经典的Java Date? 你能告诉我正确的方法吗?
谢谢。 编辑: 这是我使用的绑定文件: 谢谢,我稍微修改了你的xml并将它与netbeans一起附加到客户端的webservice并且它有效。这是我使用的绑定:
<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" wsdlLocation="../wsdl/localhost_8080/web_test/Testor.wsdl" >
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Date"
xmlType="xsd:dateTime"
parseMethod="lol.XsdDateTimeConverter.unmarshal"
printMethod="lol.XsdDateTimeConverter.marshalDateTime"
/><jaxb:javaType
name="java.util.Date"
xmlType="xsd:date"
parseMethod="lol.XsdDateTimeConverter.unmarshal"
printMethod="lol.XsdDateTimeConverter.marshalDate"
/>
</jaxb:globalBindings>
</jaxws:bindings>
答案 0 :(得分:19)
未经测试,但应该有效。首先创建这样的类:
import javax.xml.bind.DatatypeConverter;
public class XsdDateTimeConverter {
public static Date unmarshal(String dateTime) {
return DatatypeConverter.parseDate(dateTime).getTime();
}
public static String marshalDate(Date date) {
final GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
return DatatypeConverter.printDate(calendar);
}
public static String marshalDateTime(Date dateTime) {
final GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(dateTime);
return DatatypeConverter.printDateTime(calendar);
}
}
然后将其添加到自定义xjb
文件中:
<javaType
name="java.util.Date"
xmlType="xs:dateTime"
parseMethod="XsdDateTimeConverter.unmarshal"
printMethod="XsdDateTimeConverter.marshalDateTime"
/>
<javaType
name="java.util.Date"
xmlType="xs:date"
parseMethod="XsdDateTimeConverter.unmarshal"
printMethod="XsdDateTimeConverter.marshalDate"
/>
</globalBindings>
未经测试,但应该有效。根据我在这里的回答:JAX-WS and Joda-Time?
答案 1 :(得分:1)
感谢Tomasz。以上解决方案有效。
但是wsimport还将其适配器集(如Adapter1.java和Adapter2.java)与其包 org.w3._2001.xmlschema 相加,这实际上与我自己的包结构不匹配。
我找到了一种方法来使用另一个jaxb绑定来更改此包名称。实际上,我搜索了很多,但很难找到这个,所以我在这里添加它给任何寻找相同的人。
使用&#39; -b binding.xml&#39;在wsimport中添加以下绑定。请注意,wsimport可以使用多个绑定文件。
binding.xml 以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<annotation><appinfo>
<jaxb:schemaBindings>
<jaxb:package name="com.abc.xyz.utils"/>
</jaxb:schemaBindings>
</appinfo></annotation>
</schema>