很簡單的問題,很難找到一個答案: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限制嗎?
感謝您的回答!
感謝您的回答。我猜Json-Dojo-Spring中的引用沒有被使用過。如上所述,我找不到任何示例或文檔。我即將使用id來簡化串行器和解串器。 – adreide 2011-12-16 10:09:15