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

Posted

技术标签:

【中文标题】无法处理托管/反向引用“defaultReference”:反向引用类型 (java.util.List) 与托管类型不兼容【英文标题】:Can not handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type 【发布时间】:2017-11-13 02:24:06 【问题描述】:

我已经开始为 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<>();

请注意,我使用了@JsonManagedReference 和@JsonBackReference 注释来避免循环引用。

这是我的子元素 JobTask`

@Entity
@Table(name="JOB_TASK")
public class JobTask 

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

private String taskDescription;

@ManyToOne
@JoinColumn(name="JOB_ID")
@JsonBackReference(value="tasks")
private Job job;`

然后我尝试了一个 POST 请求以使用以下 JSON 来创建作业


"jobCode": "QM",
"jobDescription": "Quaterly Maintenance",
"taskList": [

     "taskDescription": "Quarter Engine Asess"
 ,
 
      "taskDescription": "Quarter Break Asess"
 
]`

但是现在我的 POST 请求低于异常`

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

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

任何帮助将不胜感激

谢谢, 凯斯

【问题讨论】:

【参考方案1】:

我认为你应该使用这样的实现 Serializable :

    @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
    

这个例子运行良好。

【讨论】:

嗨@Mohamed Elgarnaoui,感谢您的回复。我试过了,没有运气。顺便说一句,实现 Serializable 接口和 Jackson De-Serialize 功能背后的理论是什么

以上是关于无法处理托管/反向引用“defaultReference”:反向引用类型 (java.util.List) 与托管类型不兼容的主要内容,如果未能解决你的问题,请参考以下文章

Spring REST,JSON“无法处理托管/反向引用‘defaultReference’”415 不受支持的媒体类型

Hibernate3的hbm文件错误引用dtd文件导致项目无法启动问题处理

在 re.sub 替换模式中处理对捕获组的反向引用

Azure SQL 托管实例错误“无法加载 DLL odsole70.dll 或其引用的 DLL 之一”

在另一个托管 bean 中获取托管 bean 引用

无法从同一主机上的Web应用程序泊坞窗访问docker托管的SQL Server