- 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/
我正在尝试用 Java 构建一个字符串,该字符串的长度最多为 3,最少为 1。 我正在根据整数数组的内容构建字符串,如果数组的内容为 -1,我想在字符串中输出一个空字符。否则字符串将包含整数的字符版本
我有一个类,其中有一个方法可以在字符串中包含 NUL 字符的情况下终止程序。具体表达是这样的: stringVar.indexOf('\u0000') < 0 这个字符串是通过 Scanner 从用户
我有一个 wchar_t 数组。我需要在数组中的特定位置添加一个 unicode 空字符。 wchar_t var1[100]; var1[79] = '\u0000'; 我尝试了上面的方法,但出现以
好吧,这听起来可能是重复的,但我已经尝试了所有可能性,例如 str.strip()、str.rstrip()、str.splitline (),还 if-else 检查像: if str is not
System.out.println("-----------------------------------------------------------"); System.out.pr
我有一个奇怪的问题。我从公司内部的许多不同应用程序接收数据,并将这些数据显示在网站上。根据发送数据的系统,数据本身可能在字符串中包含一些奇怪的字符。我的问题是我有一个用户可以搜索以允许其中包含此数据的
我遇到了 aSSL ,这似乎有几年历史了,想知道是否有人有其他“安全”AJAX 连接代码示例?显然,这不如使用 SSL 证书安全,但使用 null character SSL在那里进行攻击(最近针对
我有一个类似于以下内容的 pyspark 数据框: df = sql_context.createDataFrame([ Row(a=3, b=[4,5,6],c=[10,11,12], d='b
我有以下要执行的查询: MyModel.objects.annotate(current_name=Coalesce('nickname', 'name')).order_by('current_na
每当 rails 变量等于 nil(或者实际上每当我使用 rails 代码(参见第 3 个代码示例))时,我的 html 中就会得到一串空字符。 new.html.haml %h1.editable.
我是一名优秀的程序员,十分优秀!