In my previous post A Core Service Java Client, I was describing how to generate the proxy classes for the Java client. It turns out, however, that the custom bindings I was using for converting DateTime string representations to java.util.Date were not working properly. When I was running my client, all the dates were coming back 'null'.
The problem was the default Adapter code generated by wsimport. I saw the conversion too simplistically. The custom bindings that I was using
would generate the following adapter code:
The dates trafficked between the webservice and client are in the format yyyy-MM-ddTHH:mm:ss and, for the adapter above, would yield an exception and a 'null' overall value.
Note: SimpleDateFormat is not thread-safe, hence the new instance on every call.
The custom bindings needs to be changed to instruct wsimport to make use of the two methods (as per documentation):
I had put the two converter methods inside class Utils, in package mitza.coreservice.util.
Finally, running wsimport again yields the following Adapter class:
This works very well...
The updated code is available in my Google Code project.
The problem was the default Adapter code generated by wsimport. I saw the conversion too simplistically. The custom bindings that I was using
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings generateElementProperty="false">
<jxb:javaType name="java.util.Date" xmlType="xs:dateTime"/>
</jxb:globalBindings>
</jxb:bindings>
would generate the following adapter code:
public class Adapter1 extends XmlAdapter<String,
Date> {
public Date unmarshal(String value) {
return new Date(value);
}
public String marshal(Date value) {
if (value == null) {
return null;
}
return value.toString();
}
}
The dates trafficked between the webservice and client are in the format yyyy-MM-ddTHH:mm:ss and, for the adapter above, would yield an exception and a 'null' overall value.
Solution
The solution is to provide my own converter. I implemented the following two utility methods:
public static String parseDateToString(Date date) {
SimpleDateFormat
formatter = new SimpleDateFormat(DATE_PATTERN);
return formatter.format(date);
}
public static Date parseStringToDate(String date) {
try {
SimpleDateFormat
formatter = new SimpleDateFormat(DATE_PATTERN);
return formatter.parse(date);
} catch (ParseException e) {
// big bubu
}
return null;
}
private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
The custom bindings needs to be changed to instruct wsimport to make use of the two methods (as per documentation):
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings generateElementProperty="false">
<jxb:javaType name="java.util.Date" xmlType="xs:dateTime"
parseMethod="mitza.coreservice.util.Utils.parseStringToDate"
printMethod="mitza.coreservice.util.Utils.parseDateToString" />
</jxb:globalBindings>
</jxb:bindings>
I had put the two converter methods inside class Utils, in package mitza.coreservice.util.
Finally, running wsimport again yields the following Adapter class:
public class Adapter1 extends XmlAdapter<String,
Date> {
public Date unmarshal(String value) {
return (mitza.coreservice.util.Utils.parseStringToDate(value));
}
public String marshal(Date value) {
return (mitza.coreservice.util.Utils.parseDateToString(value));
}
}
This works very well...
The updated code is available in my Google Code project.
Comments