Apache Axis 2 中没有时区的 Java 日历

标签 java datetime soap calendar wsdl

我必须使用一些我无法控制的 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 进行了测试,它有效,但我需要在生成的类中将日历数据类型更改为 XMLGregorianCalendar,如果有更新的 WSDL,这些更改可能会消失版本,我们再次生成新的类。

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

最佳答案

我从this找到了答案但不是从第一个答案开始。我通过扩展org.apache.axis2.databinding.utils.ConverterUtil创建自己的CustomConverterUtils解决了这个问题(正如Michał Niklas的答案)并删除appendTimeZone() convertToString(Calendar value) 中的方法调用。我还必须更改 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);
    }

关于Apache Axis 2 中没有时区的 Java 日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41257294/

相关文章:

java - 在多显示环境中保存 JFrame 位置

java - 将字符串连接到数组列表中

java - 如何根据时区在mysql中存储时间戳?

ios - 如何在 SQLITE 中使用 AM/PM 按日期/时间排序

java - 重新附加分离的实例 : hibernate lock()

java - 翻转位时出错

java - 检索上周一和周五日期的最佳方法是什么

web-services - Spring WS 客户端——使用服务器和客户端证书进行身份验证

web-services - 使用 New-WebServiceProxy 在 PowerShell 中添加自定义 SOAP header

c# - 如何在没有 HTTP 容器的情况下调用 WCF 操作?