非常简单的问题,很难找到答案:
我希望在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限制很多吗?
感谢您的回答!
答案 0 :(得分:0)
Dojo方法听起来需要处理完整的逻辑树,以便能够使用基于位置的引用。对于支持完全增量数据绑定的Jackson,这是不行的,即只有在读取或写入数据时可用的逻辑子集。
杰克逊默认不支持它;这种方法也不是一般的标准(AFAIK)。至少我没有看到Java库支持它。