Java Apache Axis 2 中没有时区的日历
Java Calendar without TimeZone in Apache Axis 2
我必须使用一些我无法控制的 SOAP Web 服务 API。我正在使用 Apache Axis2 生成 java 类(来自 WSDL)并且 Axis2 使用'java.util.Calendar'作为日期时间数据类型。
这里的问题是,当 Axis2 将其解析为字符串并发送请求时,API 无法识别带有 TimeZone 2016-12-31T12:00:00.000+06:30
的日期时间。那个API只知道那个格式2016-12-31T12:00:00
。我试过 calendar.clear(Calendar.ZONE_OFFSET);
但它仍然在 XML 请求中呈现 TimeZone。我使用 XMLGregorianCalendar
而不是 Calendar 进行了测试,它可以工作,但我需要在生成的 类 中将 Calendar 数据类型更改为 XMLGregorianCalendar
,如果有更新的 WSDL 版本,这些更改可能会消失,并且我们再次生成新的 类。
有什么想法吗?提前致谢。
我从 this 中找到了答案,但不是从第一个答案中找到的。我通过扩展 org.apache.axis2.databinding.utils.ConverterUtil
并删除 convertToString(Calendar value)
中的 appendTimeZone()
方法调用来创建自己的 CustomConverterUtils
从而解决了这个问题(作为 Michał Niklas 的回答)。我还必须更改 appendTime(Calendar value, StringBuffer dateString)
方法。我的 CustomConverterUtils 如下:
public class CustomeConverterUtils extends ConverterUtil {
public static String convertToString(Calendar value) {
if (value.get(Calendar.ZONE_OFFSET) == -1){
value.setTimeZone(TimeZone.getDefault());
}
StringBuffer dateString = new StringBuffer(28);
appendDate(dateString, value);
dateString.append("T");
//adding hours
appendTime(value, dateString);
return dateString.toString();
}
public static void appendTime(Calendar value, StringBuffer dateString) {
if (value.get(Calendar.HOUR_OF_DAY) < 10) {
dateString.append("0");
}
dateString.append(value.get(Calendar.HOUR_OF_DAY)).append(":");
if (value.get(Calendar.MINUTE) < 10) {
dateString.append("0");
}
dateString.append(value.get(Calendar.MINUTE)).append(":");
if (value.get(Calendar.SECOND) < 10) {
dateString.append("0");
}
dateString.append(value.get(Calendar.SECOND));
}
}
而且您还需要输入这些代码。我需要放入我的应用程序 class,因为我现在正在使用 Spring Boot.
public static void main(String[] args) throws Exception {
String convert_class = "com.ykkh.test.CustomeConverterUtils";
System.setProperty(ConverterUtil.SYSTEM_PROPERTY_ADB_CONVERTERUTIL, convert_class);
SpringApplication.run(Application.class, args);
}
一个小建议是从 Class 中获取名称,而不是将其硬编码为字符串。这将帮助我们得到编译错误,以防我们更改 CustomConverterUtil class.
的名称或包
// axis2 changes for customising the converters
String axis2_conversion_class = CustomConverterUtils.class.getName();
System.setProperty(ConverterUtil.SYSTEM_PROPERTY_ADB_CONVERTERUTIL, axis2_conversion_class);
如果您要从 Axis1 升级到 Axis2,请使用以下代码进行转换:
public class CustomConverterUtils extends org.apache.axis2.databinding.utils.ConverterUtil {
private static SimpleDateFormat zulu = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
static {
zulu.setTimeZone(TimeZone.getTimeZone("GMT"));
}
/**
* taking logic from org.apache.axis.encoding.ser.CalendarSerializer
* @param calendar
* @return
*/
@NotNull
public static String convertToString(Calendar calendar) {
Date date = calendar.getTime();
synchronized(zulu) {
return zulu.format(date);
}
}
@NotNull
public static String convertToString(Date date) {
synchronized(zulu) {
return zulu.format(date);
}
}
}
我必须使用一些我无法控制的 SOAP Web 服务 API。我正在使用 Apache Axis2 生成 java 类(来自 WSDL)并且 Axis2 使用'java.util.Calendar'作为日期时间数据类型。
这里的问题是,当 Axis2 将其解析为字符串并发送请求时,API 无法识别带有 TimeZone 2016-12-31T12:00:00.000+06:30
的日期时间。那个API只知道那个格式2016-12-31T12:00:00
。我试过 calendar.clear(Calendar.ZONE_OFFSET);
但它仍然在 XML 请求中呈现 TimeZone。我使用 XMLGregorianCalendar
而不是 Calendar 进行了测试,它可以工作,但我需要在生成的 类 中将 Calendar 数据类型更改为 XMLGregorianCalendar
,如果有更新的 WSDL 版本,这些更改可能会消失,并且我们再次生成新的 类。
有什么想法吗?提前致谢。
我从 this 中找到了答案,但不是从第一个答案中找到的。我通过扩展 org.apache.axis2.databinding.utils.ConverterUtil
并删除 convertToString(Calendar value)
中的 appendTimeZone()
方法调用来创建自己的 CustomConverterUtils
从而解决了这个问题(作为 Michał Niklas 的回答)。我还必须更改 appendTime(Calendar value, StringBuffer dateString)
方法。我的 CustomConverterUtils 如下:
public class CustomeConverterUtils extends ConverterUtil {
public static String convertToString(Calendar value) {
if (value.get(Calendar.ZONE_OFFSET) == -1){
value.setTimeZone(TimeZone.getDefault());
}
StringBuffer dateString = new StringBuffer(28);
appendDate(dateString, value);
dateString.append("T");
//adding hours
appendTime(value, dateString);
return dateString.toString();
}
public static void appendTime(Calendar value, StringBuffer dateString) {
if (value.get(Calendar.HOUR_OF_DAY) < 10) {
dateString.append("0");
}
dateString.append(value.get(Calendar.HOUR_OF_DAY)).append(":");
if (value.get(Calendar.MINUTE) < 10) {
dateString.append("0");
}
dateString.append(value.get(Calendar.MINUTE)).append(":");
if (value.get(Calendar.SECOND) < 10) {
dateString.append("0");
}
dateString.append(value.get(Calendar.SECOND));
}
}
而且您还需要输入这些代码。我需要放入我的应用程序 class,因为我现在正在使用 Spring Boot.
public static void main(String[] args) throws Exception {
String convert_class = "com.ykkh.test.CustomeConverterUtils";
System.setProperty(ConverterUtil.SYSTEM_PROPERTY_ADB_CONVERTERUTIL, convert_class);
SpringApplication.run(Application.class, args);
}
一个小建议是从 Class 中获取名称,而不是将其硬编码为字符串。这将帮助我们得到编译错误,以防我们更改 CustomConverterUtil class.
的名称或包 // axis2 changes for customising the converters
String axis2_conversion_class = CustomConverterUtils.class.getName();
System.setProperty(ConverterUtil.SYSTEM_PROPERTY_ADB_CONVERTERUTIL, axis2_conversion_class);
如果您要从 Axis1 升级到 Axis2,请使用以下代码进行转换:
public class CustomConverterUtils extends org.apache.axis2.databinding.utils.ConverterUtil {
private static SimpleDateFormat zulu = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
static {
zulu.setTimeZone(TimeZone.getTimeZone("GMT"));
}
/**
* taking logic from org.apache.axis.encoding.ser.CalendarSerializer
* @param calendar
* @return
*/
@NotNull
public static String convertToString(Calendar calendar) {
Date date = calendar.getTime();
synchronized(zulu) {
return zulu.format(date);
}
}
@NotNull
public static String convertToString(Date date) {
synchronized(zulu) {
return zulu.format(date);
}
}
}