反序列化外键
我有一个多对一的关系:A * < - >图1B和欲反序列化从具有乙的主键(乙一个JSON甲存在于分贝与该主键):反序列化外键
{
"b": 1
}
我曾尝试以下:
@Entity
@Table(name = "table_a")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class A implements Serializable {
@JsonIgnore
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "b", unique = true, nullable = false)
private B b;
}
和
@Entity
@Table(name = "table_b")
public class B implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToMany(mappedBy = "b")
private List<A> a = new ArrayList<>();
}
但对象甲与b = null
创建。我如何反序列化A与b属性正确实例化从数据库?
注意:我正在使用杰克逊版本2.6.1。
您有几种选择,这里是similar question:
@JsonCreator
厂B
类(More info)自定义解串器
-
定制
ObjectIdResolver
为@JsonIdentityInfo
像private class MyObjectIdResolver implements ObjectIdResolver { private Map<ObjectIdGenerator.IdKey,Object> _items = new HashMap<>(); @Override public void bindItem(ObjectIdGenerator.IdKey id, Object pojo) { if (!_items.containsKey(id)) _items.put(id, pojo); } @Override public Object resolveId(ObjectIdGenerator.IdKey id) { Object object = _items.get(id); return object == null ? getById(id) : object; } protected Object getById(ObjectIdGenerator.IdKey id){ Object object = null; try { //can resolve object from db here //objectRepository.getById((Integer)idKey.key, idKey.scope) object = id.scope.getConstructor().newInstance(); id.scope.getMethod("setId", int.class).invoke(object, id.key); } catch (Exception e) { e.printStackTrace(); } return object; } @Override public ObjectIdResolver newForDeserialization(Object context) { return new MyObjectIdResolver(); } @Override public boolean canUseFor(ObjectIdResolver resolverType) { return resolverType.getClass() == getClass(); } }
而且使用这样的:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, resolver = MyObjectIdResolver.class, property = "id", scope = B.class) public class B { // ... }
这里是你的情况下,相关gist demo更加广阔github project有些系列化的想法
嗨@varren,谢谢你的非常有趣的答案。我有一个关于它的问题:我如何将对象库传递给ObjectIdResolver? –
有很多选项可供考虑。 1)注入ObjectIdResolver创建ObjectMapper而不是注解[像这样](https://gist.github.com/ftagsold/38a92cba5467fe74ae6b)2)使用一些静态引用到你的版本库/服务/某些版本库工厂3)可能只是autowire它[像这里](https://github.com/terrestris/shogun2/blob/master/src/shogun2-core/src/main/java/de/terrestris/shogun2/converter/PersistentObjectIdResolver.java#L35- L41)更多信息[这里](https://github.com/terrestris/shogun2/search?utf8=%E2%9C%93&q=PersistentObjectIdResolver&type=) – varren
@ y.luis ppl说你可以使用'SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this );'类似于https://*.com/a/21562939/1032167我其实从来没有太多缺乏它。大概可以尝试像https://gist.github.com/varren/c84da2f357a1d86b24bf137f3144cc3a#file-myobjectidresolverautowired-java – varren
你想从B信息在哪里?在数据库中查看和创建自定义对象,或者只是创建与id字段空? – varren