我试图使用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:无法评估类型[简单类型,类用户]的反序列化:java.lang.IllegalArgumentException:无法处理托管/反向引用’defaultReference’:反向引用类型(java.util.List)与托管类型(User)不兼容
这是我的类User和Class Translation(为简洁起见,省略了getter,setter,构造函数等)
@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<Language> languages = new ArrayList<Language>(); @OneToMany(mappedBy = "translator", fetch = FetchType.EAGER) @JsonManagedReference private List<Translation> 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?我确实读过文档。而且我无法根据错误消息找出问题所在
我通过摆脱JsonManagedReference和JsonBackReference并将其替换为JsonIdentityInfo来解决了