Spring boot 无法处理托管/反向引用';defaultReference';:反向引用类型(java.util.List)与托管类型不兼容

Spring boot 无法处理托管/反向引用';defaultReference';:反向引用类型(java.util.List)与托管类型不兼容,spring-boot,jackson,spring-data-jpa,spring-restcontroller,spring-rest,Spring Boot,Jackson,Spring Data Jpa,Spring Restcontroller,Spring Rest,我已经开始为crud操作开发springboot REST API,并且我能够完成数据检索部分,但是在POST请求中遇到了一些问题 我有一个实体叫Job @Entity @Table(name="JOB") public class Job { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="JOB_ID") private Long jobId; @Column(name="JOB_CODE") private

我已经开始为crud操作开发springboot REST API,并且我能够完成数据检索部分,但是在POST请求中遇到了一些问题

我有一个实体叫Job

@Entity
@Table(name="JOB")
public class Job {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="JOB_ID")
private Long jobId;

@Column(name="JOB_CODE")
private String jobCode;

@Column(name="JOB_DESCRIPTION")
private String jobDescription;

@OneToMany(mappedBy="job")
@JsonManagedReference(value="tasks")
private List<JobTask> taskList = new ArrayList<>();
然后我尝试了一个POST请求,用下面的JSON创建一个作业`

{
"jobCode": "QM",
"jobDescription": "Quaterly Maintenance",
"taskList": [
{
     "taskDescription": "Quarter Engine Asess"
 },
 {
      "taskDescription": "Quarter Break Asess"
 }
]`
}
然而,现在我得到以下的职位申请例外`

无法评估类型[[简单类型,类com.abc.entity.Job]]的Jackson反序列化:java.lang.IllegalArgumentException:无法处理托管/反向引用“defaultReference”:反向引用类型(java.util.List)与托管类型(com.abc.entity.JobTask)不兼容`

我在这个网站上搜索了一下,找到了一些使用@JsonIdentityInfo的建议 而不是@JsonManagedReference/@JsonBackReference注释。但我不想使用@JsonIdentityInfo,因为当我使用GET请求读取数据时,它会返回一个Id值,而不是完全序列化的对象

任何帮助都将不胜感激

谢谢,
Keth

我认为您应该像这样使用可序列化的工具:

    @Entity
    @Table(name="JOB_TASK")
    public class JobTask implements Serializable {
    }

    @Entity
    @Table(name="JOB")
    public class Job implements Serializable {
    }
你可以在这里找到控制器来添加一些东西看看这个例子:

 @RestController
    @RequestMapping("/pays")
    public class PaysController {
        @Autowired
        IManagerPays iManagerPays;

        @RequestMapping(method = RequestMethod.POST)
        public Pays addPays(@RequestBody Pays pays) {
            return iManagerPays.addPays( pays);
        }
    }

    @Service
    public class ManagerPays implements IManagerPays {
        @Autowired
        private RepositoryPays repositorypays;

        @Override
        public Pays addPays(Pays pays) {

            return repositorypays.save(pays);
        }
    }

    @Entity
    @Table(name="ctr_pays")
    public class Pays {
        @Id
          @GeneratedValue
        private Integer idPays;
        private String nomPays;
        @OneToMany(mappedBy="pays")
        private List<Ville> villes;
        public Pays(){

        }
    //getter and setter
    }
@RestController
@请求映射(“/pays”)
公共类工资控制器{
@自动连线
IManagerPays IManagerPays;
@RequestMapping(method=RequestMethod.POST)
公共支付addPays(@RequestBody Pays-Pays){
返回iManagerPays.addPays(支付);
}
}
@服务
公共类ManagerPays实现iManager Pays{
@自动连线
私人回购支付回购支付;
@凌驾
公共支付加支付(Pays Pays){
返回回购支付。保存(支付);
}
}
@实体
@表(name=“ctr_pays”)
公共课付费{
@身份证
@生成值
私人整数日;
私人支付;
@OneToMany(mappedBy=“支付”)
私人名单;
公帑{
}
//接二连三
}

这个示例很好。

我认为您应该使用可序列化的实现,如下所示:

    @Entity
    @Table(name="JOB_TASK")
    public class JobTask implements Serializable {
    }

    @Entity
    @Table(name="JOB")
    public class Job implements Serializable {
    }
你可以在这里找到控制器来添加一些东西看看这个例子:

 @RestController
    @RequestMapping("/pays")
    public class PaysController {
        @Autowired
        IManagerPays iManagerPays;

        @RequestMapping(method = RequestMethod.POST)
        public Pays addPays(@RequestBody Pays pays) {
            return iManagerPays.addPays( pays);
        }
    }

    @Service
    public class ManagerPays implements IManagerPays {
        @Autowired
        private RepositoryPays repositorypays;

        @Override
        public Pays addPays(Pays pays) {

            return repositorypays.save(pays);
        }
    }

    @Entity
    @Table(name="ctr_pays")
    public class Pays {
        @Id
          @GeneratedValue
        private Integer idPays;
        private String nomPays;
        @OneToMany(mappedBy="pays")
        private List<Ville> villes;
        public Pays(){

        }
    //getter and setter
    }
@RestController
@请求映射(“/pays”)
公共类工资控制器{
@自动连线
IManagerPays IManagerPays;
@RequestMapping(method=RequestMethod.POST)
公共支付addPays(@RequestBody Pays-Pays){
返回iManagerPays.addPays(支付);
}
}
@服务
公共类ManagerPays实现iManager Pays{
@自动连线
私人回购支付回购支付;
@凌驾
公共支付加支付(Pays Pays){
返回回购支付。保存(支付);
}
}
@实体
@表(name=“ctr_pays”)
公共课付费{
@身份证
@生成值
私人整数日;
私人支付;
@OneToMany(mappedBy=“支付”)
私人名单;
公帑{
}
//接二连三
}

这个例子很好。

hi@Mohamed Elgarnaoui,感谢您的回复。我试过了,但没有成功。顺便问一下,实现可序列化接口和Jackson反序列化功能背后的理论是什么?Hi@Mohamed Elgarnaoui,感谢您的回复。我试过了,但没有成功。顺便问一下,实现可序列化接口和Jackson反序列化功能背后的理论是什么