在 spring 引导应用程序中将数据存储到数据库时出现问题
problems storing data to data base in spring boot app
我在使用 post 请求将数据保存到 spring 启动应用程序中的数据库时出错。
我在 class 之间有多对多映射。从数据库中获取数据时没有问题,但是当我尝试将数据保存到数据库时出现此错误。
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)
我在父实体和子实体 class 中使用 @JsonManagedReference
和 @JsonBackReference
。
这是我的映射
Child
class:
// test this mapping
@ManyToMany(mappedBy="permissions",
cascade={ CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JsonBackReference
private List<Role> roles;
Parent
class:
// 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
更新:
这是 URL I 用户发送 POST 创建角色的请求:
localhost: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);
}
我通过删除@JsonManagedReference 解决了这个问题。
如果您有两个以上的实体映射在一起,那么您需要删除每个实体中的@JsonManagedReference class。我在这里找到了这个解决方案:
.
希望对您有所帮助。
我在使用 post 请求将数据保存到 spring 启动应用程序中的数据库时出错。 我在 class 之间有多对多映射。从数据库中获取数据时没有问题,但是当我尝试将数据保存到数据库时出现此错误。
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)
我在父实体和子实体 class 中使用 @JsonManagedReference
和 @JsonBackReference
。
这是我的映射
Child
class:
// test this mapping
@ManyToMany(mappedBy="permissions",
cascade={ CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JsonBackReference
private List<Role> roles;
Parent
class:
// 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
更新:
这是 URL I 用户发送 POST 创建角色的请求: localhost: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);
}
我通过删除@JsonManagedReference 解决了这个问题。 如果您有两个以上的实体映射在一起,那么您需要删除每个实体中的@JsonManagedReference class。我在这里找到了这个解决方案:
希望对您有所帮助。