Web services 使用自定义jaxb绑定将xs:datetime获取到Joda time,但获取XMLGregorianCalender
Java 1.7 Spring 3.1.1和Spring WS 2.1.1 乔达 冬眠3.6 MySQL 5.0.57 马文3 雄猫7 Eclipse 3.7 已经部署了web服务、web客户端和web 服务和web客户端相互交谈 但就像在一个老式的电子游戏中,杀死一批龙只是产卵 又一批龙 现在是整个Joda Datetime xs:Datetime jaxb绑定的东西向我喷火 谷歌搜索找到了很多我尝试遵循的解决方案 代表性实体Web services 使用自定义jaxb绑定将xs:datetime获取到Joda time,但获取XMLGregorianCalender,web-services,jaxb,jodatime,wsdl2java,xmladapter,Web Services,Jaxb,Jodatime,Wsdl2java,Xmladapter,Java 1.7 Spring 3.1.1和Spring WS 2.1.1 乔达 冬眠3.6 MySQL 5.0.57 马文3 雄猫7 Eclipse 3.7 已经部署了web服务、web客户端和web 服务和web客户端相互交谈 但就像在一个老式的电子游戏中,杀死一批龙只是产卵 又一批龙 现在是整个Joda Datetime xs:Datetime jaxb绑定的东西向我喷火 谷歌搜索找到了很多我尝试遵循的解决方案 代表性实体 @Entity @Table(name="form_templat
@Entity
@Table(name="form_templates", catalog="mycomp")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class FormTemplate implements java.io.Serializable
{
private static final long serialVersionUID = 8533964268513480152L;
....
@Column(name="revision_datetime")
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
@XmlElement(name="revisionTimestamp")
@XmlJavaTypeAdapter(JodaDateTimeAdapter.class)
@XmlSchemaType(name="dateTime")
DateTime revisionTimestamp;
....
}
JodaDateTimeAdapter
@XmlTransient
public class JodaDateTimeAdapter extends XmlAdapter<String, DateTime>
{
private static final DateTimeFormatter XML_DATE_FORMAT = ISODateTimeFormat.dateTimeNoMillis();
private static final DateTimeFormatter XML_DATE_TIME_FORMAT = ISODateTimeFormat.localDateOptionalTimeParser();
private static final DateTimeFormatter DATE_PATTERN = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
public DateTime unmarshal(String dateStr) throws Exception
{ //parsing from schema to java class
DateTime result = DATE_PATTERN.parseDateTime(dateStr);
return result;
}
public String marshal(DateTime dateTime) throws Exception
{ //printing from java class to schema
String result = DATE_PATTERN.print(dateTime);
return result;
}
}
@xmltransive
公共类JodDateTimeAdapter扩展了XmlAdapter
{
私有静态最终DateTimeFormatter XML_DATE_FORMAT=ISODateTimeFormat.dateTimeNoMillis();
私有静态最终DateTimeFormatter XML_DATE_TIME_FORMAT=ISODateTimeFormat.localDateOptionalTimeParser();
私有静态最终日期timeformatter DATE_PATTERN=DateTimeFormat.forPattern(“yyyy-MM-dd'T'HH:MM:ss.SSS”);
公共DateTime解组器(字符串dateStr)引发异常
{//从模式到java类的解析
DateTime result=DATE\u PATTERN.parseDateTime(dateStr);
返回结果;
}
公共字符串封送处理程序(DateTime DateTime)引发异常
{//从java类打印到架构
字符串结果=DATE\u PATTERN.print(日期时间);
返回结果;
}
}
聚甲醛相关部分
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-java2ws-plugin</artifactId>
<version>${cxfVersion}</version>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxfVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>${cxfVersion}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>process-classes</id>
<phase>process-classes</phase>
<configuration>
<outputFile>src/main/webapp/WEB-INF/wsdl/FormsService.wsdl</outputFile>
<className>com.mycomp.forms.web.endpoint.FormsEndpoint</className>
<genWsdl>true</genWsdl>
<verbose>true</verbose>
</configuration>
<goals>
<goal>java2ws</goal>
</goals>
</execution>
</executions>
</plugin>
org.apache.cxf
cxf-java2ws-plugin
${cxfVersion}
org.apache.cxf
cxf rt前端jaxws
${cxfVersion}
org.apache.cxf
cxf rt前端简单
${cxfVersion}
进程类
进程类
src/main/webapp/WEB-INF/wsdl/FormsService.wsdl
com.mycop.forms.web.endpoint.FormsEndpoint
真的
真的
java2ws
因此,web服务可以成功编译和部署。我在wsdl中查看并看到
...
<xs:complexType name="formTemplate">
<xs:sequence>
...
<xs:element minOccurs="0" name="revisionTimestamp" type="xs:dateTime"/>
...
。。。
...
...
看来我的方向是对的。部署web服务后,我将注意力转向
到web客户端
我用这个相关的pom片段编译web客户端
...
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxfVersion}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated_sources</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>http://localhost:8080/dept_forms_webservice/formsService?wsdl</wsdl>
<bindingFiles>
<bindingFile>${basedir}/src/main/resources/jaxb-custom-bindings.xml</bindingFile>
</bindingFiles>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
...
。。。
org.apache.cxf
cxf-codegen插件
${cxfVersion}
生成源
生成源
${project.build.directory}/生成的\u源
http://localhost:8080/dept_forms_webservice/formsService?wsdl
${basedir}/src/main/resources/jaxb-custom-bindings.xml
wsdl2java
...
以及位于/src/java/resources中的jaxb-custom-bindings.xml
<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings wsdlLocation="http://localhost:8080/dept_forms_webservice/formsService?wsdl"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
<jaxws:bindings>
<jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime"
parseMethod="com.mycomp.forms.util.JodaDateTimeAdapter.unmarshall"
printMethod="com.mycomp.forms.util.JodaDateTimeAdapter.marshall"/>
</jxb:globalBindings>
</jaxws:bindings>
</jaxws:bindings>
一切都会编译,生成源代码,成功部署web客户端
但是
查看我看到的生成的FormTemplate实体
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar; // <---- should be joda datetime here
public class FormTemplate
{
...
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar revisionTimestamp; // <-- should be joda datetime here
...
import javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.XmlSchemaType;
导入javax.xml.bind.annotation.XmlType;
导入javax.xml.datatype.XMLGregorianCalendar;// 我使用了这种配置,效果很好
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:annox="http://annox.dev.java.net"
xmlns:tns="http://esb.tsf.ab.com/enterprise/message"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
jaxb:extensionBindingPrefixes="xjc annox"
version="2.1">
<jaxb:globalBindings>
<xjc:serializable uid="12343" />
<jaxb:javaType name="java.util.Date" xmlType="xs:date" printMethod="adapter.DateAdapter.printDate" parseMethod="adapter.DateAdapter.parseDate" />
<jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" printMethod="adapter.DateTimeAdapter.printDateTime" parseMethod="adapter.DateTimeAdapter.parseDateTime" />
<jaxb:javaType name="java.util.Date" xmlType="xs:time" printMethod="adapter.TimeAdapter.printTime" parseMethod="adapter.TimeAdapter.parseTime" />
</jaxb:globalBindings>
</jaxb:bindings>
我使用这个插件来生成bean
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<args>
<arg>-Xannotate</arg>
<arg>-nv</arg>
<arg>-Xnamespace-prefix</arg>
</args>
<extension>true</extension>
<schemaDirectory>src/main/resources/schema/xsd</schemaDirectory>
<schemaIncludes>
<schemaInclude>my.xsd</schemaInclude>
</schemaIncludes>
<bindingDirectory>src/main/resources/schema/xjb</bindingDirectory>
<bindingIncludes>
<include>*.xjb</include>
</bindingIncludes>
<debug>true</debug>
<verbose>true</verbose>
<episode>true</episode>
<forceRegenerate>true</forceRegenerate>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.6.0</version>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.0</version>
</plugin>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-namespace-prefix</artifactId>
<version>1.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
0.8.1
生成源
生成
-山奈特
-内华达州
-XX名称空间前缀
真的
src/main/resources/schema/xsd
my.xsd
src/main/resources/schema/xjb
*.xjb
真的
真的
真的
真的
org.jvnet.jaxb2_commons
jaxb2基础知识
0.6.0
org.jvnet.jaxb2_commons
jaxb2基础注释
0.6.0
org.jvnet.jaxb2_commons
jaxb2名称空间前缀
1.1
并将此参数用于wsdl2java
<wsdlOption>
<wsdl>${basedir}/src/main/resources/schema/integration/wsdl/CostPriceMaintenance.wsdl</wsdl>
<extraargs>
<extraarg>-nexclude</extraarg>
<extraarg>http://namespace</extraarg>
</extraargs>
</wsdlOption>
${basedir}/src/main/resources/schema/integration/wsdl/CostPriceMaintenance.wsdl
-下一步包括
http://namespace
尝试使用此配置,您将有一个附加的
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
<jxb:globalBindings>
<jxb:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime"
parseMethod="com.mycomp.forms.util.JodaDateTimeAdapter.unmarshall"
printMethod="com.mycomp.forms.util.JodaDateTimeAdapter.marshall"/>
</jxb:globalBindings>
</jxb:bindings>
您解决了这个问题吗?如果是,您是如何解决的?