java 日期为空值,java-XMLGregorianCalendar日期序列化为空字符串

使用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是否存在一些已知问题正在影响我?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值