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

我正在尝试使用Spring boot / Spring RestController后端从AngularJS前端POST到http:// localhost:9095 / translators 。

我可以做一个GET,响应如下:

[{"userId":1,"firstName":"John","lastName":"Doe","emailId":"john.doe@inc.com","languages":[{"languageId":1,"languageCode":"gb","source":true}],"translations":[{"translationId":3,"sourceId":1,"sourceText":"Hello","targetId":null,"targetText":null,"translationStatus":"DUE"}],"userType":"TRANSLATOR"} 

当我发布下面的json时,我得到了错误响应

发布数据:

 { firstName: "zen", lastName: "cv", emailId: "email", userType: "TRANSLATOR", languages : [{languageId:1,languageCode:"gb",source:true}] } 

错误:

 { timestamp: 1422389312497 status: 415 error: "Unsupported Media Type" exception: "org.springframework.web.HttpMediaTypeNotSupportedException" message: "Content type 'application/json' not supported" path: "/translators" } 

我确保我的控制器具有正确的Mediatype注释。

 @RestController @RequestMapping("/translators") public class TranslatorController { @Autowired private UserRepository repository; @RequestMapping(method = RequestMethod.GET) public List findUsers() { return repository.findAll(); } @RequestMapping(value = "/{userId}", method = RequestMethod.GET) public User findUser(@PathVariable Long userId) { return repository.findOne(userId); } @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public User addTranslator(@RequestBody User user) { //translation.setTranslationId(null); return repository.saveAndFlush(user); } @RequestMapping(value = "/{translatorId}", method = RequestMethod.PUT) public User updateTranslation(@RequestBody User updatedUser, @PathVariable Long userId) { //updatedTranslation.setTranslationId(translationId); return repository.saveAndFlush(updatedUser); } @RequestMapping(value = "/{translatorId}", method = RequestMethod.DELETE) public void deleteTranslation(@PathVariable Long translationId) { repository.delete(translationId); } } 

经过一些研究,并通过查看日志输出,我意识到这是一个误导性的错误消息,问题实际上是在序列化/反序列化Json时发生的

在日志文件中,我发现

2015-01-27 21:08:32.488 WARN 15152 — [nio-9095-exec-1] .cjMappingJackson2HttpMessageConverter:无法评估类型[simple type,class User]的反序列化:java.lang.IllegalArgumentException:无法处理托管/后向引用’defaultReference’:与托管类型(User)不兼容的后引用类型(java.util.List)

这是我的类用户和类翻译(为了简洁省略了getter,setter,constructor等)

 @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy= GenerationType.AUTO) @Column(name = "user_id") private long userId; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "email_id") private String emailId; @ManyToMany @JoinTable(name = "languages_users", joinColumns = { @JoinColumn(name = "user_id")}, inverseJoinColumns = {@JoinColumn(name = "lang_id")}) @JsonManagedReference private List languages = new ArrayList(); @OneToMany(mappedBy = "translator", fetch = FetchType.EAGER) @JsonManagedReference private List translations; @Enumerated(EnumType.STRING) private UserType userType; } @Entity @Table(name = "translations") public class Translation { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name = "translation_id") private Long translationId; @Column(name = "source_lang_id") private Long sourceId; @Column(name = "source_text") private String sourceText; @Column(name = "target_lang_id") private Long targetId; @Column(name = "target_text") private String targetText; @Enumerated(EnumType.STRING) @Column(name = "status") private TranslationStatus translationStatus; @ManyToOne @JoinColumn(name = "translator_id") @JsonBackReference private User translator; } 

我的问题是:如何为上述实体正确设置JsonManagedReference和JsonBackReference? 我确实读过这份文件。 我根据错误信息无法弄清楚这里有什么问题

对于那些要求,另一种方法是使用fasterxml的JsonIdentityInfo并使用以下方法注释您的类:

 import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") public class Account implements java.io.Serializable { .... private Long id; } 

*没有足够的代表评论。

我通过摆脱JsonManagedReference和JsonBackReference并用JsonIdentityInfo替换它来解决它

正如@Sharppoint在评论中所说,我通过删除@JsonManagedReference解决了我的问题,但保留@JsonBackReference

您需要@ResponseBody注释,如下所示:

 @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public User addTranslator(@RequestBody User user) { //translation.setTranslationId(null); return repository.saveAndFlush(user); } 

我有同样的错误,我解决了删除所有注释@JsonBackReference和@JsonManagedReference,然后我把@JsonIdentityInfo放在我的所有关系中与关系检查文档