我必须使用一些我无法控制的SOAP Web服务API。我使用Apache Axis2生成java类(来自WSDL),Axis2使用'java.util.Calendar'作为日期时间数据类型。
此处的问题是当Axis2将其解析为String并发送请求时,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版本并且我们生成新类,那些更改可能会消失试。
有什么想法吗?提前谢谢。
答案 0 :(得分:2)
我从this找到了答案,但没有从第一个答案中找到答案。我通过在CustomConverterUtils
中扩展org.apache.axis2.databinding.utils.ConverterUtil
并删除appendTimeZone()
方法调用来创建自己的convertToString(Calendar value)
来解决问题(如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));
}
}
你还需要输入这些代码。我需要放入我的Application类,因为我现在正在使用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);
}