Apache Axis 2中没有TimeZone的Java日历

时间:2016-12-21 07:27:18

标签: java datetime soap calendar wsdl

我必须使用一些我无法控制的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版本并且我们生成新类,那些更改可能会消失试。

有什么想法吗?提前谢谢。

1 个答案:

答案 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);
    }