2012-02-21 44 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