Как преобразовать дату (ActionScript 3) в java.util.Date через XML? - PullRequest
1 голос
/ 14 января 2011

Я хочу преобразовать дату (ActionScript 3) в java.util.Date через XML.

Сначала напишите пользовательский класс 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" имеет значение null? И, пожалуйста, сообщите мне решения, если таковые имеются.

Ответы [ 3 ]

1 голос
/ 14 января 2011

Вы можете использовать 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);
    }

}

Затем укажите этот XmlAdapter в свойстве userDate вашего класса User:

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 см .:

UPDATE

На основании ваших комментариев, если вы хотите указать это как аннотацию уровня пакета, вам нужно включить класс с именем package-info в тот же пакет, что и ваши классы модели. Этот класс будет выглядеть так:

@XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
package example;

import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

Если вы хотите использовать альтернативные способы указания метаданных JAXB, вы можете использовать расширение представления XML в EclipseLink JAXB (MOXy), я технический руководитель:

В качестве альтернативы, вы можете убедиться, что дата, которая передается в JAXB, имеет следующий формат (xsd: dateTime):

[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
1 голос
/ 14 января 2011

Текстовое представление ваших Flash Date и java.util.Date, вероятно, несовместимо. Поскольку оба объекта даты внутренне основаны на количестве миллисекунд с 1 января 1970 года, я бы рекомендовал использовать date.time в AS3, чтобы получить целочисленное значение даты, отправить ее в Java, а затем использовать date.setTime(), чтобы установить правильная дата.

0 голосов
/ 14 января 2011

Возможно, вы захотите изучить использование BlazeDS для обработки конвертации между AMF (сериализованным AS3) и сериализованным POJO.

У меня нет большого опыта использования JAXB для демаршалла, но я узнал об этом в сети.

Правильный формат для типа даты и времени XML-схемы: гггг-мм-DDThh: мм: сс

Если вы измените дату на следующую, вы все еще видите ошибку? 2006-02-01T08: 00: 00

Вы можете использовать DateFormatter, если вы используете Flex, в противном случае вы можете создать метод получения на стороне AS3 для возврата надлежащим образом отформатированной даты. Ответ Велтраумпирата представляется одинаково верным.

...