Java 通过apach camel中的dozer使用XmlSchemaType date to dateTime强制转换XMLGregorianCalendar时的Emty字符串
我在将带有XmlSchema(日期)的日期粘贴到带有XmlSchema(日期时间)的日期时间时遇到了一个问题-在路由的末尾获取空的日期时间值。 如何解决这个问题 课程:Java 通过apach camel中的dozer使用XmlSchemaType date to dateTime强制转换XMLGregorianCalendar时的Emty字符串,java,jaxb,apache-camel,dozer,Java,Jaxb,Apache Camel,Dozer,我在将带有XmlSchema(日期)的日期粘贴到带有XmlSchema(日期时间)的日期时间时遇到了一个问题-在路由的末尾获取空的日期时间值。 如何解决这个问题 课程: package test; @XmlRootElement(name = "Datetime") public class DateTime { @XmlAttribute(name="dateTime") @XmlSchemaType(name = "date") protected XMLGrego
package test;
@XmlRootElement(name = "Datetime")
public class DateTime {
@XmlAttribute(name="dateTime")
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar DateTime;
//getter setter
}
package test;
@XmlRootElement(name = "Date")
public class Date {
@XmlAttribute(name="date")
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar Date;
//getter setter
}
推土机测绘:
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<wildcard>false</wildcard>
</configuration>
<mapping map-null="false">
<class-a>test.Date</class-a>
<class-b>test.DateTime</class-b>
<field>
<a>Date</a>
<b>DateTime</b>
</field>
</mapping>
</mappings>
假的
测试日期
测试日期时间
日期
日期时间
骆驼上下文:
<camelContext id="camelContext-111" xmlns="http://camel.apache.org/schema/blueprint">
<endpoint id="CastToDateTime" uri="dozer:DateToDateTime?sourceModel=test.Date&targetModel=test.DateTime&mappingFile=dozer/DateToDateTime.xml" />
<route id="ADP.ADP_MAIN">
<from id="_from1" uri="activemq:queue:Test"/>
<unmarshal>
<jaxb contextPath="test" partClass="test.Date" />
</unmarshal>
<to ref="CastToDateTime"/>
<to uri="mock:result"/>
</route>
</camelContext>
由于我没有访问change Xsd模式的权限,我创建了定制的XmlAdapter和jxb绑定文件——这不是最好的解决方案,但它可以工作 XmlAdapter:
package test;
public class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> {
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public XMLGregorianCalendar unmarshal(String v) throws Exception {
return null;
}
@Override
public String marshal(XMLGregorianCalendar v) throws Exception {
Calendar calendar = v.toGregorianCalendar();
dateFormat.setTimeZone(calendar.getTimeZone());
return dateFormat.format(calendar.getTime());
}
封装测试;
公共类DateAdapter扩展了XmlAdapter{
私有最终SimpleDateFormat dateFormat=新SimpleDateFormat(“yyyy-MM-dd”);
@凌驾
公共XMLGregorianCalendar解组(字符串v)引发异常{
返回null;
}
@凌驾
公共字符串封送处理程序(XMLGregorianCalendar v)引发异常{
日历=v.toGregorianCalendar();
dateFormat.setTimeZone(calendar.getTimeZone());
return dateFormat.format(calendar.getTime());
}
绑定文件:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<jaxb:bindings schemaLocation="OUR_XML_SCHEMA.xsd">
<jaxb:schemaBindings>
<jaxb:package name="OUR_PACKAGE_NAME"/>
</jaxb:schemaBindings>
<jaxb:bindings node="XPATH_TO_NODE">
<xjc:javaType name="javax.xml.datatype.XMLGregorianCalendar" adapter="test.DateAdapter"/>
</jaxb:bindings>
</jaxb:bindings>
在此之后,当我们调用封送或取消封送func时,我们的xmlAdapter将成功地以“yyyy-MM-dd”格式将日期粘贴到datetime。
我希望这会对某人有所帮助