Women in Technology

Hear us Roar



Article:
  Understanding JAXB: Java Binding Customization
Subject:   Date problem...
Date:   2003-12-29 17:00:28
From:   hashimisayed
Response to: Date problem...

JAXB maps an xs:date to a java.util.Calendar. Because dates can be represented in various formats, you might have to customize how the date is parsed and what type of object to return after the parsing. Since your dates are not correct, then more than likely the format of your dates does not match what java.util.Calendar is expecting. So, what you want to do is write a little class that parses your dates for you. To do that, you have to write some JAXB customization and a simple class.


Lets assume that you want all the dates in your schema to be treated the same and that when JAXB sees an xs:date it should return a java.util.Date and not the default java.util.Calendar. For simplicity, lets also assume that your dates are formatted as: "yyyy-mm-dd".


1) Add JAXB Customization to the globalBindings section:


<jaxb:globalBindings>
<jaxb:javaType name="java.util.Date" xmlType="xs:date" printMethod="SimpleDateFormatter.print" parseMethod="SimpleDateFormatter.parse"/>
</jaxb:globalBindings>



2) Write a class that formats the date and returns a java.util.Date.



public class SimpleDateFormatter
{
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
public static Date parse(String date)throws ParseException
{
return dateFormat.parse(date);
}
public static String print(Date date)
{
String result = null;
if(date!=null)
{
result = dateFormat.format(date);
}
return result;
}
}



A couple of things to realize.


1) If you have to write a class to format and return dates, then you will have to make that class available to the schema compiler when you compile the xsd; you do that by executing the jar file (jaxb-xjc.jar) and using the classpath (-cp) switch.
2) You maybe able to use an existing class. For example, if my dates were really formatted as "yyyy-MM-dd", then you could use java.sql.Date and not have to write a new class and have to deal with (1).
3) Finally, if all of your dates are not formatted the same then you need to write xml simpleTypes for the dates and add customization to each one separately. Here is an example:



<xs:simpleType name="Date">
<xs:annotation>
<xs:appinfo>
<jaxb:javaType name="java.sql.Date" xmlType="xs:date" printMethod="valueOf" parseMethod="toString"/>
</xs:appinfo>
</xs:annotation>
<xs:restriction base="xs:date"/>
</xs:simpleType>


sayed


Main Topics Oldest First

Showing messages 1 through 2 of 2.

  • Date problem...
    2005-03-23 11:26:53  Jaxnitup [View]

    I hav a similiar issue....

    I am getting the following eror when trying to compile the Java object using the xjc script

    Here is the portion of my XSD which uses the custom JXB declarations:
    -------------------------------
    <xs:complexType name="ccbndatetype" mixed="true">
    <xs:annotation>
    <xs:appinfo>
    <jxb:javaType name="java.util.Date" parseMethod="com.calpine.webservice.client.xml.ccbn.CCBNDateConverter.parseStringToDate" printMethod="com.calpine.webservice.client.xml.ccbn.CCBNDateConverter.parseDateToString"/>
    </xs:appinfo>
    </xs:annotation>
    <xs:simpleContent>
    <xs:extension base="xs:string">
    <xs:attribute name="Date" type="xs:int" use="required"/>
    <xs:attribute name="Time" type="xs:time" use="required"/>
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    ------------------------

    When i run the following...
    %JAXB_HOME%\bin\xjc.bat -extension ccbn-complex-global.xsd -p com.calpine.webservice.client.xml.ccbn

    It returns this error:
    parsing a schema...
    [ERROR] <javaType> customization in this context must be nested (JAXB spec sec 6.8.1):
    <property>
    <baseType>
    <javaType ...>
    </baseType>
    </property>
    line 17 of ccbn-complex-global.xsd


    Line 17 is the '<xs:appinfo>' just above the custom jxb:JavaType tag


    PLEASE help!!!!
  • Date problem...
    2005-03-22 02:38:57  matmayer [View]

    Correction to date customization using java.sql.date :

    <jxb:javaType name="java.sql.Date" xmlType="xs:date" printMethod="toString" parseMethod="valueOf"/>


    It will work better ;-)