在 Spring Boot 应用程序中将数据存储到数据库的问题

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中将数据存储到数据库的问题【英文标题】:problems storing data to data base in spring boot app 【发布时间】:2018-12-04 19:16:36 【问题描述】:

在 Spring Boot 应用程序中使用 post 请求将数据保存到数据库时出现错误。 我在类之间有多对多的映射。从数据库中获取数据时我没有遇到任何问题,但是当我尝试将数据保存到数据库时出现此错误。

2018-06-26 12:19:32.016  WARN 3156 --- [nio-8080-exec-1] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.greydelta.entity.Permission]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type (com.greydelta.entity.Role)
2018-06-26 12:19:32.018  WARN 3156 --- [nio-8080-exec-1] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.greydelta.entity.Permission]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'defaultReference': back reference type (java.util.List) not compatible with managed type (com.greydelta.entity.Role)

我在父实体类和子实体类中使用@JsonManagedReference@JsonBackReference

这是我的映射 Child类:

    // test this mapping
@ManyToMany(mappedBy="permissions",
        cascade= CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH )
@JsonBackReference
private List<Role> roles;

Parent类:

    // test this mapping
@ManyToMany(fetch = FetchType.EAGER,
        cascade = CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH)
@JoinTable( name="role_permission",
            joinColumns= @JoinColumn(name="role_id"),
            inverseJoinColumns= @JoinColumn(name="permission_id"))
@JsonManagedReference
private List<Permission> permissions; // create getter/setter

更新:

这是我用户发送 POST 请求以创建角色的 URL: 本地主机:8080/角色

这是我在 Postman 中得到的回复:


    "timestamp": "2018-06-26T08:18:03.167+0000",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/json;charset=UTF-8' not supported",
    "path": "/roles"

这是控制器方法:

@PostMapping("/roles")
public void createRole(@RequestBody Role theRole)      

    roleService.createRole(theRole);


【问题讨论】:

你显示的只是一个警告。你有一个实际问题的迹象吗?我猜你是通过做某种 HTTP 请求来“保存”的。您能展示一下您使用的 curl 语句或类似语句吗? @Jens Schauder,我已经更新了这个问题。请看一看。 【参考方案1】:

我通过删除@JsonManagedReference 解决了这个问题。 如果您有两个以上的实体被映射在一起,那么您需要在每个实体类中删除 @JsonManagedReference。我在这里找到了这个解决方案:

Spring REST, JSON "Can not handle managed/back reference 'defaultReference'" 415 Unsupported Media Type.

我希望这会有所帮助。

【讨论】:

以上是关于在 Spring Boot 应用程序中将数据存储到数据库的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中将数据库模式更改从源数据库同步到目标数据库

在 Spring Boot 中将未知请求重定向到 index.html

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

如何在 Spring Boot 应用程序中将用户添加到嵌入式 tomcat?

Spring Boot 应用程序无法在 Docker 中将事件发布到 Kafka

在 Spring Boot 应用程序中将 mongo db 升级到 3.2