将Spring数据与MongoDB一起使用。
问题是实例化从Mongo检索的bean,因为构造函数有一些实际上在嵌套对象中的参数。坚持不是问题。检索是。
类结构如下所示,其中B嵌套在A中.A集B使用其构造函数Params实例化它。
A类
{"prop1":"Hello1","b":{"prop2":"Hello2"}}
嵌套在A
中的B类 org.springframework.data.mapping.model.MappingException: No property prop2
found on entity class A to bind constructor parameter to
当REST API以下面的Json格式收到Object时:
public A(int prop1, B b){
......
......
}
Spring Controller接收它并将其正确映射到Object A.由于Spring默认使用no-arg构造函数,因此我在arg-constructor上使用了jsoncreator注释,并且它没有任何大惊小怪地添加到MongoDB中。
根据bean结构,数据以下面的格式存储,这是正确的。
org.springframework.data.mapping.model.MappingInstantiationException:
Failed to instantiate A using constructor NO_CONSTRUCTOR with
arguments.
出现问题:当我尝试从Mongo检索时出现错误。它说:
knex
从SpringData获取它时,如何告诉SpringData使用包含prop2的对象? (也许那是不可能的)
我想也许添加一个构造函数就可以了,我将对象B用作下面的构造函数参数之一:
dbConnection
添加一个构造函数可以使用ObjectMapper,但不能使用SpringData。
这次抛出了一个新的异常:
dbConnection
我检查了使用/未使用List的上述错误,但我尝试了两种方式并没有解决。
请注意:我使用对象B作为嵌套,因为它包含将被许多其他bean使用的公共属性(可能是抽象类,但我稍后需要尝试,但不知何故抽象类似乎有限制)< / p>
SpringData如何创建对象A?
答案 0 :(得分:1)
看起来像一个失礼。
应该在搜索中使用更好的术语。本来可以找到正确的答案。以防万一有人面临这个问题...
有些搜索让我想到了以下问题:
How exactly does spring-data-mongodb handle constructors when rehydrating objects?
上述问题提到了一些给我解决方案的事情。答案在于使用另一个构造函数从SpringData反序列化到bean。此构造函数需要注释:
@PersistenceConstructor
在问题的示例中,如果我使用带有此注释的第二个构造函数,则检索可以正常工作。
@PersistenceConstructor
public A(int prop1, B b){
......
......
}
现在,我有2个构造函数,一个使用@jsoncreator,另一个使用@PersistenceConstructor。但是要添加,除了从SpringData中检索之外,如果你没有其他用途,那么这个其他构造函数也可以是私有的,并且任何人都不会在代码中使用它,从而保持业务逻辑的完整性。 因此,下面也会有效:
@PersistenceConstructor
private A(int prop1, B b){
......
......
}