使用XmlSchemaType将XMLGregorianCalendar转换为日期时的Emty字符串通过apach camel中的dozer将日期转换为dateTime

时间:2017-03-23 17:43:42

标签: java jaxb apache-camel dozer

我在使用XmlSchema(date)将日期与XmlSchema(日期)粘贴到DateTime时出现问题 - 在路径结束时获取空的DateTime值。 如何解决这个问题?

课程:

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&amp;targetModel=test.DateTime&amp;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>

1 个答案:

答案 0 :(得分:0)

由于我无法访问更改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());
    }

绑定文件:

<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>

在此之后,当我们调用marshal或unmarshal func时,我们的xmlAdapter将成功将日期粘贴到日期时间格式&#; yyyy-MM-dd&#39;。 我希望这对某人有所帮助。