Java 1.7 Spring 3.1.1 与 Spring-WS 2.1.1 Joda Hibernate 3.6 MySQL 5.0.57 Maven 3 Tomcat 7 Eclipse 3.7
已经部署了 Web 服务和 Web 客户端,并且 Web 服务和 Web 客户端相互通信。
但就像在老式电子游戏中一样,杀死一批龙只会产生另一批龙。
现在是整个 Joda Datetime xs:dateTime jaxb 绑定的东西向我喷火。
谷歌搜索出现了很多我试图遵循的解决方案。
代表实体
@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;
}
}
pom的相关部分
<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>
至此,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>
...
和 jaxb-custom-bindings.xml 位于 /src/java/resources
<?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
...
所以我显然错过了一些微观的配置细节,如果有人能指出什么是错误的以及如何纠正它,我将不胜感激。
TIA,
仍在学习的史蒂夫