- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用 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
。在调试器中,或者如果我添加日志输出,调用日期对象的 toXMLFormat()
方法仅返回一个日期,例如 2011-12-09
。使用调试器检查日期对象本身,我看到它的 year
、day
和 month
字段已填充,所有其他字段都已填充null
或 -2147483648
是 DatatypeConstants.FIELD_UNDEFINED
的值。根据我找到的所有文档和互联网搜索结果,我的日期对象的格式是正确的。
我疯了吗?服务器真的出错了吗?生成的客户端代码拒绝发送日期只对吗?这是一个合理的“未定义行为”案例吗?是否使用了错误的实现类(无论如何这可能很重要)? wsimport
是否存在影响我的已知问题?
最佳答案
我发现 JAXB 的日期转换不应该留给他们自己的设备。不太熟悉 wsimport,但它是否允许您指定绑定(bind)文件?我使用 Joda Date/Time,但我敢肯定这个想法是一样的。将此添加到我的 binding.xjb:
<globalBindings>
<serializable />
<javaType name="org.joda.time.DateTime" xmlType="xsd:dateTime"
printMethod="someStaticDateConverterClass.printDateIso"
parseMethod="someStaticDateConverterClass.parseDateIso" />
<javaType name="org.joda.time.DateTime" xmlType="xs:date"
printMethod="someStaticDateConverterClass.printDateYYYYDashMMDashDD"
parseMethod="someStaticDateConverterClass.parseDateYYYYDashMMDashDD" />
</globalBindings>
这样的类:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
public class someStaticDateConverterClass{
private static DateTimeFormatter isoFormat = ISODateTimeFormat.dateTime();
private static DateTimeFormatter YYYYDashMMDashDDFormat = DateTimeFormat
.forPattern("yyyy-MM-dd");
private static DateTimeFormatter YYYYMMDDFormat = DateTimeFormat
.forPattern("yyyyMMdd");
public static String printDateIso(DateTime value) {
return printDate(value, isoFormat);
}
public static DateTime parseDateIso(String value) {
return parseDate(value, isoFormat);
}
public static String printDateYYYYDashMMDashDD(DateTime value) {
return printDate(value, YYYYDashMMDashDDFormat);
}
public static DateTime parseDateYYYYDashMMDashDD(String value) {
return parseDate(value, YYYYDashMMDashDDFormat);
}
public static String printDateYYYYMMDD(DateTime value) {
return printDate(value, YYYYMMDDFormat);
}
public static DateTime parseDateYYYYMMDD(String value) {
return parseDate(value, YYYYMMDDFormat);
}
private static String printDate(DateTime value, DateTimeFormatter format) {
String dateAsStr;
if (value != null) {
dateAsStr = value.toString(format);
} else {
dateAsStr = null;
}
return dateAsStr;
}
private static DateTime parseDate(String value, DateTimeFormatter format) {
DateTime strAsDate;
if (value != null) {
strAsDate = format.parseDateTime(value);
} else {
strAsDate = null;
}
return strAsDate;
}
}
关于java - XMLGregorianCalendar 日期序列化为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448266/
下面是我的代码 GregorianCalendar gregory=new GregorianCalendar(); gregory.setTime(new Date()); XMLGregorian
我目前遇到了 XMLGregorianCalendar 格式化问题,想向 Java 专家寻求帮助。通过来自其他系统的函数调用,我在网页上显示了一个数据对象,其中包含“SUBMIT_DATE”:1516
在我们的应用程序中,我们使用提供肥皂响应 XML(文档样式)的 Web 服务。 当我检查网络服务提供商时,他们只是一个转换的接口(interface)他们从不同来源获取的响应节点值(Subscribe
这个问题已经有答案了: Calendar to Date conversion for dates before 15 Oct 1582. Gregorian to Julian calendar s
我使用下面的代码在 Web 服务中设置 XMLGregorianCalendar 字段 SimpleDateFormat format = new SimpleDateFormat("dd-MMM-y
我从数据库中获取一些日期,将它们放入使用 JAXB 从 XSD 模式派生的类的对象中,然后将对象编码到 XML 文件。 其中一个派生类具有 XMLGregorianCalendar 字段,我希望将放在
这个问题已经有答案了: java.util.Date to XMLGregorianCalendar (10 个回答) 已关闭 7 年前。 我从字符串日期转换为 XMLGregorianCalenda
这个问题在这里已经有了答案: Why does sdf.format(date) converts 2018-12-30 to 2019-12-30 in java? [duplicate] (3
我正在创建一系列日期,以 JSON 字符串的形式存储在数据库中,并且它们全部保存为 GMT(例如,2015-05-01T13:00:00.000Z)。我的计算机采用 GMT+2,因此当我尝试显示它们时
我在将日历对象转换为 YYYY-MM-DD HH:mm:ss 格式的 XML 公历时遇到了一些问题。 我当前的代码是: Calendar createDate = tRow.getBasic().ge
我需要从 XML 填充 JAX Bean,但是没有 setter 方法。我在下面收到以下消息 Failed to invoke public javax.xml.datatype.XMLGregor
我如何比较 XMLGregorianCalendar 的 2 个实例以找出哪个更大? 其中一个日期变量有值 date1 = 2009-02-23T05:54:17+05:30 还有一个, date2
使用 Java 1.6 wsimport 我从 WSDL 为 Web 服务生成了源代码。请求结构中的一个字段在 WSDL 包含的 XML 架构中具有类型 xs:dateTime,在生成的代码中具有类型
我正在开发一个以 XML 形式来回调用的 Web 服务程序。然而,我的问题不在于此。当我在我的机器上本地(在 Eclipse 中)运行它时,它似乎可以工作。但是,当我的同事运行它时/如果我尝试在服务器
我在 UI 中有以下格式的日期.. Eg: Thu. 03/01 我将它们转换为 XMLGregorianCalendar,如下所述。 final DateFormat format = new Si
我必须通过 jax-ws 公开一个 ejb 服务层。 我已经使用 jax-ws 和 wsimport 生成了 Web 服务,但我被一个奇怪的事情阻止了;日期被映射到 XmlGregorianCalen
我有一个日期作为输入 = 2021-03-12T10:42:01.000Z.... 我想转换成这种格式: String pattern = "yyyy-MM-dd'T'HH:mm:ssZ"; publ
我有一个 XML Jaxb 类来设置 XMLGregorianCalendar 类型。但是我们应该在这个属性中只设置年份。 XMLGregorianCalendar xmlCal = Datatype
我有一个日期作为输入 = 2021-03-12T10:42:01.000Z.... 我想转换成这种格式: String pattern = "yyyy-MM-dd'T'HH:mm:ssZ"; publ
我有一个 XML Jaxb 类来设置 XMLGregorianCalendar 类型。但是我们应该在这个属性中只设置年份。 XMLGregorianCalendar xmlCal = Datatype
我是一名优秀的程序员,十分优秀!