【问题标题】:How to convert Date(ActionScript 3) to java.util.Date through a xml?如何通过 xml 将 Date(ActionScript 3) 转换为 java.util.Date?
【发布时间】:2011-01-14 01:30:18
【问题描述】:

我想通过 xml 将 Date(ActionScript 3) 转换为 java.util.Date。

首先,像这样编写一个用户定义的 ActionScript 类。

public class User
{
    public function User()
    {
        userDate = new Date();
    }

    public var id:String = null;
    public var password:String = null;
    public var userDate:Date = null;

}

其次,创建它的实例并设置每个值,因此它将 ActionScript 类转换为 xml,以便使用具有其架构文件的 XMLEncoder。

这是结果 xml,并将此 xml 发送到服务器以使用 HTTPService。

<User>
  <id>system</id>
  <password>manager</password>
  <userDate>Fri Jan 14 09:02:17 GMT+0900 2011</userDate>
</User>

最后,在 Java 的服务器端,我想将此 xml 转换为 Java 类,以便使用 JAXB Unmarshaller。

public class User {

    public User() {
    }

    private String id;
    private String password;
    private Date userDate;


    public void setId(String id) {
        this.id = id;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setUserDate(Date userDate) {
        this.userDate = userDate;
    }
    public String getId() {
        return id;
    }
    public String getPassword() {
        return password;
    }
    public Date getUserDate() {
        return userDate;
    }

}

但是,因此,“UserDate”属性只会为空...

为什么“UserDate”属性为空? 如果有,请告诉我解决方案。

【问题讨论】:

    标签: actionscript-3 xml-serialization jaxb marshalling unmarshalling


    【解决方案1】:

    您的 Flash Datejava.util.Date 的文本表示可能不兼容。由于两个日期对象在内部都是基于自 1970 年 1 月 1 日以来的毫秒数,我建议在 AS3 中使用 date.time 来获取日期的整数值,将其发送到 Java,然后使用 date.setTime() 设置正确的日期。

    【讨论】:

    【解决方案2】:

    您可以使用 XmlAdapter 来完成此操作:

    package example;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    public class DateAdapter extends XmlAdapter<String, Date> {
    
        private SimpleDateFormat format = new SimpleDateFormat("EEE MMM d HH:mm:ss zZ yyyy");
    
        @Override
        public Date unmarshal(String v) throws Exception {
            System.out.println(format.parse(v));
            return format.parse(v);
        }
    
        @Override
        public String marshal(Date v) throws Exception {
            return format.format(v);
        }
    
    }
    

    然后在你的 User 类的 userDate 属性上指定这个 XmlAdapter:

    package example;
    
    import java.util.Date;    
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    @XmlRootElement(name="User")
    public class User {
    
        private String id;
        private String password;
        private Date userDate;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @XmlJavaTypeAdapter(DateAdapter.class)
        public Date getUserDate() {
            return userDate;
        }
    
        public void setUserDate(Date userDate) {
            this.userDate = userDate;
        }
    
    }
    

    有关 XmlAdapter 的更多信息,请参阅:

    更新

    根据您的 cmets,如果您想将其指定为包级别注释,您需要在与模型类相同的包中包含一个名为 package-info 的类。这个类看起来像:

    @XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
    package example;
    
    import java.util.Date;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    

    如果您想要指定 JAXB 元数据的替代方法,您可以使用 EclipseLink JAXB (MOXy) 中的 XML 表示扩展,我是技术负责人:

    或者,您可以确保传递给 JAXB 的日期采用以下格式 (xsd:dateTime):

    [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
    

    【讨论】:

    • 谢谢布莱斯!但我想在没有 Java 类中的任何注释的情况下完成此操作。而且我知道@XmlJavaTypeAdapters 注释可以放入package-info.java 文件,但我不知道如何使用package-info.java 文件...
    • @Take - 我已经更新了我的答案,其中包含有关使用 package-info 的说明。
    • @Blaise,@XmlJavaTypeAdapter 可以在没有@XmlRootElement 模型/xml 定义的情况下工作吗?我们有一个定义 Web 服务的 Java 接口。通过 CXF/ant 生成一个 WSDL 的“合同”(第 3 方编码了一个服务器)。该接口包含一个 @XmlJavaTypeAdapter 方法,该方法返回一个 MAP,由适配器根据 @goo.gl/wlG6F 找到的 WSMAP* 解决方案解组。我已经尝试过直接注释和 package-info.java,但我得到一个 'org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"return")' 和我的'WSMapAdapter' 没有被调用。想法?
    【解决方案3】:

    您可能只想研究使用 BlazeDS 来处理 AMF(序列化 AS3)和序列化 POJO 之间的转换工作。

    我没有很多使用 JAXB 解组的经验,但在互联网上发现了这一点。

    XML Schema dateTime 类型的正确格式是: yyyy-mm-ddThh:mm:ss

    如果您将日期更改为以下日期,您是否仍然看到错误? 2006-02-01T08:00:00

    如果您在 Flex 中,您可以使用 DateFormatter,否则您可以在 AS3 端创建一个 getter 以返回适当格式化的日期。 weltraumpirat 的回答似乎同样有效。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2017-08-03
      • 2019-08-11
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多