繁体   English   中英

构造函数参数和Spring数据反序列化问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM