Как конвертировать Date (ActionScript 3) в java.util.Date через xml?
Я хочу преобразовать Date (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?
И, пожалуйста, скажите мне решения, если они есть.
Ответы
Ответ 1
Текстовое представление вашей Flash Date
и java.util.Date
, вероятно, несовместимо. Поскольку оба объекта даты внутренне основаны на количестве миллисекунд с 1 января 1970 года, я бы рекомендовал использовать date.time
в AS3, чтобы получить целочисленное значение даты, отправив его на 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);
}
}
Затем укажите этот 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]
Ответ 3
Вы можете просто взглянуть на использование BlazeDS для обработки задания преобразования между AMF (serialized AS3) и сериализованным POJO.
У меня нет большого опыта использования JAXB для unmarshall, но он нашел это в интерфейсах.
Правильный формат типа DateTime для схемы XML:
гггг-мм-ДДTчч: мм: сс
Если вы изменили дату на следующую, вы все еще видите ошибку?
2006-02-01T08: 00: 00
Вы можете использовать DateFormatter, если вы в Flex, иначе вы могли бы сделать getter на стороне AS3, чтобы вернуть соответствующую отформатированную дату. Ответ weltraumpirat кажется одинаково действительным.