【发布时间】:2015-03-26 14:13:10
【问题描述】:
我正在尝试使用 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 时,我得到 error 响应
POST 数据:
{
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 警告 15152 --- [nio-9095-exec-1] .c.j.MappingJackson2HttpMessageConverter:评估失败 类型[简单类型,用户类]的反序列化: java.lang.IllegalArgumentException:无法处理托管/返回 引用'defaultReference':反向引用类型(java.util.List)不是 兼容托管类型(用户)
这是我的类用户和类翻译(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?我确实阅读了doc.,但根据错误消息我无法弄清楚这里出了什么问题
【问题讨论】:
-
通过删除
@JsonManagedReferenceBUT keep`@JsonBackReference解决了我的问题。 -
@Sharppoint,你的建议对我有用……很奇怪,但它奏效了!
-
@Sharppoint 考虑将其添加为答案
-
@Sharppoint 的答案是正确的!也帮了我。
标签: java json hibernate jackson spring-boot