如何通过xml将Date(ActionScript 3)转换为java.util.Date?

时间:2011-01-14 01:30:18

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

我想通过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”属性只会为null ...

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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]

答案 2 :(得分:0)

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

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

XML Schema dateTime类型的正确格式是: YYYY-MM-DDTHH:MM:SS

如果您将日期更改为以下内容,您仍会看到错误吗? 2006-02-01T08:00:00

如果你在Flex中,你可以使用DateFormatter,否则你可以在AS3端做一个getter来返回格式正确的日期。 weltraumpirat的回答似乎同样有效。