![](/img/trans.png)
[英]Customization of serialization policy spring-data-mongodb without using annotations
[英]constructor Arguments and Spring Data De-Serialization Issue
在MongoDB中使用Spring Data。
问题在于实例化从Mongo检索到的bean,因为构造函数具有一些实际上位于嵌套对象内部的参数。 持久性不是问题。 检索是。
类结构如下,其中B嵌套在A内。A使用其构造函数Params之一实例化B的集合B。
A级
Class A{
int prop1;
B b;
@JsonCreator
public A( @JsonProperty int prop1, @JsonProperty int prop2){
this.prop1 = prop1;
this.b = new B(prop2);
}
}
嵌套在A内的B类
Class B(){
int prop2;
@JsonCreator
public B(@JsonProperty int prop2){
this.prop2 = prop2;
}
}
REST API以以下Json形式接收Object时:
{"prop1":"Hello1","prop2":"Hello2"}
Spring Controller接收它并将其正确映射到对象A。由于Spring默认使用no-arg构造函数,因此我在arg-constructor上使用了jsoncreator批注,并且将其添加到MongoDB中没有大惊小怪。
数据按照正确的bean结构以以下格式存储。
{"prop1":"Hello1","b":{"prop2":"Hello2"}}
出现问题:当我尝试从Mongo检索时出现错误。 它说:
org.springframework.data.mapping.model.MappingException: No property prop2
found on entity class A to bind constructor parameter to
从SpringData获取对象时,如何告诉SpringData使用包含prop2的对象B? (也许那不可能)
我以为也许再增加一个构造函数就能解决问题,在这里我将对象B用作构造函数参数之一,如下所示:
public A(int prop1, B b){
......
......
}
再添加一个构造函数可以使用ObjectMapper,但是不能再使用SpringData。
这次抛出了一个新的异常:
org.springframework.data.mapping.model.MappingInstantiationException:
Failed to instantiate A using constructor NO_CONSTRUCTOR with
arguments.
我在使用/未使用List的地方检查了以上错误,但是我尝试了两种方法但都没有解决。
请注意:我将对象B嵌套使用,因为它包含将由许多其他bean使用的公共属性(可能是抽象类,但是我稍后需要尝试,但是抽象类似乎有限制)
SpringData如何创建对象A?
看起来像个假人。
应该在搜索中使用更好的术语。 会找到正确的答案。 万一有人面对这个问题...
一些搜索使我想到了以下问题:
在为对象补水时,spring-data-mongodb如何正确处理构造函数?
上面的问题提到了一些给我解决方案的事情。 答案在于使用另一个构造函数从SpringData到bean反序列化。 该构造函数需要添加以下注释:
@PersistenceConstructor
在问题的示例中,如果我将第二个构造函数与该注释一起使用,则检索有效。
@PersistenceConstructor
public A(int prop1, B b){
......
......
}
所以现在,我有2个构造函数,一个带有@jsoncreator,另一个带有@PersistenceConstructor。 但是要补充一点,如果您除了从SpringData检索之外没有其他用途,则该其他构造函数也可以是私有的,并且任何人都不会在代码中使用它,因此您的业务逻辑保持不变。 因此,以下内容也将起作用:
@PersistenceConstructor
private A(int prop1, B b){
......
......
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.