Spring MVC,REST,Jackson,Dojo dojox.data.jsonRestStore,如何制作dojo风格的引用?

时间:2011-12-15 10:30:22

标签: json spring-mvc jackson dojo

非常简单的问题,很难找到答案:

我希望在JSON中序列化我的POJO JPA实体,其引用类似Dojo,与dojox.data.JsonRestStore一起使用。

服务器部分由Spring MVC和HttpConverters构成,使其成为RESTfull Web应用程序。我正在使用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;
}

使用基本的Jackson Json转换器,您可以获得类似的内容(考虑到您已经放置了@JsonBackReference和@JsonManagedReference):

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

在具体的应用程序中,在大多数情况下,拥有A对象的b列表是没有意义的。但是知道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限制很多吗?

感谢您的回答!

1 个答案:

答案 0 :(得分:0)

Dojo方法听起来需要处理完整的逻辑树,以便能够使用基于位置的引用。对于支持完全增量数据绑定的Jackson,这是不行的,即只有在读取或写入数据时可用的逻辑子集。

杰克逊默认不支持它;这种方法也不是一般的标准(AFAIK)。至少我没有看到Java库支持它。