Jakarta ee 将带有timestamp/date的实体从Grails生成的XML读入Java POJO

Jakarta ee 将带有timestamp/date的实体从Grails生成的XML读入Java POJO,jakarta-ee,grails,jersey,jax-rs,Jakarta Ee,Grails,Jersey,Jax Rs,我有一个grails应用程序,它通过类似REST的API发送从JavaPOJO生成的xml 在客户端,有一个Java客户端,它使用从XML创建的相同Java POJO(Grails和Java客户端使用相同的jar库) 由于某些原因,XML中的日期无法到达Java POJO。我怎么把它弄进去?我错过了什么把戏吗?Grails从数据库获取日期(该列是时间戳类型),XML具有日期和时间,POJO具有类型date,但时间的getter在客户端返回null 以下是POJO代码: @Entity @Tabl

我有一个grails应用程序,它通过类似REST的API发送从JavaPOJO生成的xml

在客户端,有一个Java客户端,它使用从XML创建的相同Java POJO(Grails和Java客户端使用相同的jar库)

由于某些原因,XML中的日期无法到达Java POJO。我怎么把它弄进去?我错过了什么把戏吗?Grails从数据库获取日期(该列是时间戳类型),XML具有日期和时间,POJO具有类型
date
,但时间的getter在客户端返回
null

以下是POJO代码:

@Entity
@Table(name = "MODEL_VIEW")
@XmlRootElement
public class Model implements Serializable {

    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = "MODEL_ID")
    @Id
    private BigInteger modelId;

    @Column(name = "LAST_MODIFIED")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModified;

    public Model() {
    }

    public BigInteger getModelId() {
        return modelId;
    }

    public void setModelId(BigInteger modelId) {
        this.modelId = modelId;
    }

    public Date getLastModified() {
        return lastModified;
    }

    public void setLastModified(Date lastModified) {
        this.lastModified = lastModified;
    }

}
更新

以下是XML(由Grails生成,使用与客户机相同的实体类,如上所述):


1046
2013-09-17 17:42:17.478太平洋时报
以下是从XML创建POJO的客户端上的代码:

public synchronized List<Model> getAllModels() {
    return targetModel.request(MEDIA_TYPE).get(new GenericType<List<Model>>(){});
}

// psuedo code that creates the "targetModel" object
    private final static String BASE_URL ="http://mybiz.com/myapp"; 
    private Client client = ClientBuilder.newClient();
    client.register(new HttpBasicAuthFilter(username,password));
    private WebTarget targetBase = client.target(BASE_URL);
    private WebTarget targetModel = targetBase.path("model");
公共同步列表getAllModels(){ 返回targetModel.request(媒体类型).get(新的GenericType(){}); } //创建“targetModel”对象的psuedo代码 私有最终静态字符串BASE_URL=”http://mybiz.com/myapp"; private Client Client=ClientBuilder.newClient(); 注册(新的HttpBasicAuthFilter(用户名、密码)); 私有WebTarget targetBase=client.target(BASE\u URL); 私有WebTarget targetModel=targetBase.path(“模型”);
这是使用Java EE 7和Jersey client 2.0的,最终的解决方案是根据

请注意
getLastModified()
上的
@XmlJavaTypeAdapter
注释。它必须在getter上运行,因为JPA和JAXB都被使用。


注意,
@XmlJavaTypeAdapter
注释可以放在包中,然后它将应用于所有日期类型

最终的解决方案是根据

请注意
getLastModified()
上的
@XmlJavaTypeAdapter
注释。它必须在getter上运行,因为JPA和JAXB都被使用。


注意,
@XmlJavaTypeAdapter
注释可以放在包中,然后它将应用于所有日期类型

你能分享xml吗,以及如何从xml转换成pojo吗?看看这篇文章:@SérgioMichels,done。我在pojo代码中添加了xml和xml。谢谢你的帮助@Jason查看TP_JAVA链接,您需要调整Jersey读取的日期格式,或者更改Grails API以Jersey想要的格式发送日期。是的,使用XMLJavaTypeAdapter和自定义类作为适配器工作,但有一种特殊情况:我需要将XMLJavaTypeAdapter放在getter上,而不是变量声明上。看到并能分享xml,以及如何从xml转换为pojo吗?看看这篇文章:@SérgioMichels,done。我在pojo代码中添加了xml和xml。谢谢你的帮助@Jason查看TP_JAVA链接,您需要调整Jersey读取的日期格式,或者更改Grails API以Jersey想要的格式发送日期。是的,使用XMLJavaTypeAdapter和自定义类作为适配器工作,但有一种特殊情况:我需要将XMLJavaTypeAdapter放在getter上,而不是变量声明上。看到和
public synchronized List<Model> getAllModels() {
    return targetModel.request(MEDIA_TYPE).get(new GenericType<List<Model>>(){});
}

// psuedo code that creates the "targetModel" object
    private final static String BASE_URL ="http://mybiz.com/myapp"; 
    private Client client = ClientBuilder.newClient();
    client.register(new HttpBasicAuthFilter(username,password));
    private WebTarget targetBase = client.target(BASE_URL);
    private WebTarget targetModel = targetBase.path("model");
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS z");

    @Override
    public String marshal(Date v) throws Exception {
        return dateFormat.format(v);
    }

    @Override
    public Date unmarshal(String v) throws Exception {
        return dateFormat.parse(v);
    }

}
@Entity
@Table(name = "MODEL_VIEW")
@XmlRootElement
public class Model implements Serializable {

    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = "MODEL_ID")
    @Id
    private BigInteger modelId;

    @Column(name = "LAST_MODIFIED")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModified;

    public Model() {
    }

    public BigInteger getModelId() {
        return modelId;
    }

    public void setModelId(BigInteger modelId) {
        this.modelId = modelId;
    }

    @XmlJavaTypeAdapter(DateAdapter.class)
    public Date getLastModified() {
        return lastModified;
    }

    public void setLastModified(Date lastModified) {
        this.lastModified = lastModified;
    }

}