2012-02-21 49 views
0

我有一个这样的实体:GAE JPA和REST:生产实体(如JSON或XML)与datastore.Key

@Entity 
@XmlRootElement 
public class Article { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private com.google.appengine.api.datastore.Key key; 
private String content; 
private String title; 
private Date created; 
private Date lastUpdate; 

private boolean isActive; 

    /* public getter and setters */ 
} 

现在我有一个休息webserivce返回的文章:

@SuppressWarnings({ "unchecked", "unused" }) 
@GET 
@Path("/{user}") 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
public List<Article> getArtilceListByUser(@PathParam("user") String userName) { 

    List<Article> articles = null; 
    EntityManager em = EMF.get().createEntityManager(); 
    try { 
     articles = (List<Article>) em.createQuery("SELECT FROM Article WHERE createdBy = :user AND isActive = true") 
        .setParameter("user", userName) 
        .getResultList(); 
     // lazy load is activated, but em is closed (find a better solution) 
     for (Article article : articles) ; 

    } finally { 
     em.close(); 
    } 

    return articles; 
} 

的问题是,com.google.appengine.api.datastore.Key的对象不能获得序列化到JSON或XML,但我需要的物品的ID ......所以才有我使用long-type为id还是添加一个额外的字段,其中包含密钥?你对这个问题有更好的解决方案吗?

回答

0

com.google.appengine.api.datastore.KeyFactory.keyToString

然后

com.google.appengine.api.datastore.KeyFactory.stringToKey

这些创建和使用“网络安全“只是为了这个目的。

+0

将Id作为字符串获取并不是问题,因此将密钥编组为json或xml是个问题。所以我正在寻找正确的模式来产生我的实体在JSON或XML **与**的ID。 – GreenPepper 2012-02-22 10:59:01

+0

不确定你的意思。一旦密钥是一个字符串,就很容易序列化它......有许多工具/框架可以序列化json。我们使用Jersey(http://jersey.java.net/),这是一个符合jax-rs的框架。这对您的需求来说可能太重了,但使用起来非常简单。许多人也使用resteasy:http://www.jboss.org/resteasy – 2012-02-22 14:38:24

+0

这不是我的问题。我只是在寻找一个好的模式。那么你的意思是我应该只添加一个只返回id的getter方法? – GreenPepper 2012-02-22 14:42:32