2011-12-15 59 views
0

很簡單的問題,很難找到一個答案:Spring MVC,REST,Jackson,Dojo dojox.data.jsonRestStore,如何製作dojo風格的引用?

我想用JSON作爲參考道場般與dojox.data.JsonRestStore用它來序列化我的POJO JPA實體。

服務器部分是由Spring MVC和HttpConverters製作的,使它成爲一個REST滿網頁應用程序。我使用JacksonJson將JPA實體轉換爲JSON。

像很多人一樣,我確實遇到了多個引用的問題。 @JsonBackReference和@JsonManagedReference不要這樣做!

考慮這個簡單的例子:

public class A { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(nullable=false) 
    private String field; 

    @OneToMany(mappedBy = "b") 
    private List<B> bs; 
} 

public class B { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @ManyToOne 
    private A a; 
} 

有了基本傑克遜Json的轉換器,你得到這樣的事情(考慮您已經把@JsonBackReference和@JsonManagedReference):

{ id:1, fieldB:"bbbbb", a: { id:1, fieldA: "aaaaaa" }} 

在具體在大多數情況下,擁有A對象的bs列表是毫無意義的。但是知道B.a領域裏的什麼樣的A對象是重要的(至少對我來說)。

現在,問題在於被複制的引用,並且最終會產生一些嚴重的大JSON,而且數據量不多。

Dojo框架提供了一個在這裏解釋的參考標準:http://www.sitepen.com/blog/2008/06/17/json-referencing-in-dojo/http://dojotoolkit.org/reference-guide/dojox/data/JsonRestStore.html

那麼我在尋找一種方式將其定義爲如下:

{ id:1, fieldB:"bbbbb", a: { $ref: "getA/1"}} 

第一個問題:傑克遜顯然無法知道你會用什麼網址爲參考。

要解決這個問題我做了很簡單的界面是這樣的:

public interface EntityWithId { 
    public Long getId(); 
    public void setId(Long id); 
} 

該界面中,然後用我所有的實體實施,我做了這個非常非常簡單的JsonSerializer:

public class EntityIdSerializer extends JsonSerializer<EntityWithId> { 

    @Override 
    public void serialize(EntityWithId value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
       jgen.writeStartObject(); 
       jgen.writeStringField("$ref", "db/" + value.getClass().getSimpleName() + "/" + value.getId().toString()); 
       jgen.writeEndObject(); 
    } 
} 

有了這些兩個我得到了所需的JSON,將@JsonSerialize(使用= EntityIdSerializer.class)添加到@ManyToOne字段。

有沒有更多的標準方法? Dojo dojox.data.JsonRestStore聽起來非常有希望,因爲您可以將它與許多Dijits小部件結合起來,但是這是一件很棒的事情嗎?我的REST應用不會受到Dojo限制嗎?

感謝您的回答!

回答

0

Dojo方法聽起來像它需要處理完整的邏輯樹,才能夠使用基於位置的引用。對於支持完全增量數據綁定的Jackson而言,這並不適用,即只有在讀取或寫入數據時可用的邏輯子集。

因此傑克遜默認不支持它;這種方法也沒有考慮太多的標準(AFAIK)。至少我沒有看到它受Java庫支持。

+0

感謝您的回答。我猜Json-Dojo-Spring中的引用沒有被使用過。如上所述,我找不到任何示例或文檔。我即將使用id來簡化串行器和解串器。 – adreide 2011-12-16 10:09:15