使用Java 1.6 wsimport,我从WSDL生成了Web服务的源.请求结构中的字段之一在WSDL所包含的XML模式中具有xs:dateTime类型,在生成的代码中具有javax.xml.datatype.XMLGregorianCalendar类型.
通过soapUI的手动测试,我确定Web服务接受以下序列化值:2011-12-08、2011-12-08Z.以下内容不被接受,在这种情况下,响应为空回复(不是明确的错误):2011-12-08T20:00:00、2011-12-08T20:00:00-05:00.如果重要的话,服务本身就是.NET支持的.
我的想法是服务器应该接受完整的日期/时间而仅拒绝日期,但是反之则是正在发生的事情.但是我不认为服务器的维护者会开放以进行更改.因此,我试图说服客户仅发送日期.
我无法说服客户代码将XMLGregorianCalendar对象序列化为仅日期.好吧,实际上我可以,除非生成的代码可以做到.当生成的客户机代码(由wsimport生产)执行该操作时,序列化的值为空字符串,并且服务器正确返回错误.我使用数据包嗅探器对此进行了验证.
这是我在请求中创建和填充日期字段的方式:
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.TimeZone;
// also import GeneratedRequest from generated packages
private makeRequest() {
GeneratedRequest request;
// ...
request.setDateField(xmlDayNow(TimeZone.getTimeZone("America/New_York"),
6)); // broadcast day starts at 6 am EST
// ...
}
@XmlSchemaType(name="date")
private static XMLGregorianCalendar xmlDayNow(TimeZone tz, int localHourStart)
throws MyException {
GregorianCalendar cal = gregorianBroadcastDayNow(tz, localHourStart);
XMLGregorianCalendar result;
try {
result = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(
cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1,
cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED)
.normalize();
} catch (DatatypeConfigurationException e) {
throw new MyException("XMLGregorianCalendar issue", e);
}
return result;
}
protected static GregorianCalendar gregorianBroadcastDayNow(TimeZone tz,
int localHourStart) {
GregorianCalendar now = new GregorianCalendar(tz);
if (now.get(GregorianCalendar.HOUR_OF_DAY) < localHourStart) {
now.add(GregorianCalendar.DAY_OF_MONTH, -1);
}
return now;
}
在我的案例中,XMLGregorianCalendar的实现类是com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.在调试器中,或者如果我添加日志输出,则调用date对象的toXMLFormat()方法仅返回日期,例如2011-12-09.使用调试器检查日期对象本身,我看到它的年,日和月字段已填充,所有其他字段为null或-2147483648,这是DatatypeConstants.FIELD_UNDEFINED的值.根据我发现的所有文档和Internet搜索结果,我的日期对象格式正确.
我疯了吗?服务器真的有错误吗?拒绝生成的客户代码仅发送日期是否正确?这是合理的“不确定行为”案例吗?是否使用了错误的实现类(无论如何可能很重要)? wsimport是否存在一些已知问题正在影响我?