1

我想通过 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”属性为空?并且,如果有的话,请告诉我解决方案。

4

3 回答 3

1

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

于 2011-01-14T01:37:45.010 回答
1

您可以使用 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 的更多信息,请参见:

更新

根据您的评论,如果要将其指定为包级别注释,则需要在与模型类相同的包中包含一个名为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]
于 2011-01-14T18:22:24.480 回答
0

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

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

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

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

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

于 2011-01-14T01:44:18.240 回答