[英]How to solve the com.fasterxml.jackson.databind.JsonMappingException?
[英]Could not read document: N/A com.fasterxml.jackson.databind.JsonMappingException
我正在構建一個通過REST和HTTP進行通信的服務器-客戶端應用程序。 我的問題是,我嘗試創建一個任務。 我從客戶端發送的JSON如下所示:
{
"taskType": "USER_STORY",
"headLine": "ew",
"taskText": "wewe",
"author": {
"id": 1,
"confirmed": false,
"email": "testlogin@test.de",
"userName": "Daniel",
"password": "test",
"creationTime": 1466843454239,
"assignedTasks": [
{
"id": 1,
"possibleTaskTypes": [
"USER_STORY",
"TECHNICAL_STORY",
"BUG"
],
"possibleTaskContainer": [
"PRODUCT_BACKLOG",
"SELECTED_BACKLOG",
"SPRINT"
],
"taskType": "USER_STORY",
"headLine": "123",
"taskText": "fsfd",
"possibleworkFlowStati": [
"START",
"READY_FOR_ESTIMATION",
"READY_FOR_SPRINT",
"OPEN",
"IN_PROGRESS",
"DONE"
],
"author": {
"id": 1,
"confirmed": false
},
"assignee": {
"id": 1,
"confirmed": false
},
"comments": [],
"creationTime": 1466843507898
}
],
"createdTasks": [
{
"id": 1,
"possibleTaskTypes": [
"USER_STORY",
"TECHNICAL_STORY",
"BUG"
],
"possibleTaskContainer": [
"PRODUCT_BACKLOG",
"SELECTED_BACKLOG",
"SPRINT"
],
"taskType": "USER_STORY",
"headLine": "123",
"taskText": "fsfd",
"possibleworkFlowStati": [
"START",
"READY_FOR_ESTIMATION",
"READY_FOR_SPRINT",
"OPEN",
"IN_PROGRESS",
"DONE"
],
"author": {
"id": 1,
"confirmed": false
},
"assignee": {
"id": 1,
"confirmed": false
},
"comments": [],
"creationTime": 1466843507898
}
]
},
"assignee": {
"id": 1,
"confirmed": false,
"email": "testlogin@test.de",
"userName": "Daniel",
"password": "test",
"creationTime": 1466843454239,
"assignedTasks": [
{
"id": 1,
"possibleTaskTypes": [
"USER_STORY",
"TECHNICAL_STORY",
"BUG"
],
"possibleTaskContainer": [
"PRODUCT_BACKLOG",
"SELECTED_BACKLOG",
"SPRINT"
],
"taskType": "USER_STORY",
"headLine": "123",
"taskText": "fsfd",
"possibleworkFlowStati": [
"START",
"READY_FOR_ESTIMATION",
"READY_FOR_SPRINT",
"OPEN",
"IN_PROGRESS",
"DONE"
],
"author": {
"id": 1,
"confirmed": false
},
"assignee": {
"id": 1,
"confirmed": false
},
"comments": [],
"creationTime": 1466843507898
}
],
"createdTasks": [
{
"id": 1
}
]
}
}
我從服務器收到的錯誤消息是這樣的:
{
"title": "Message Not Readable",
"status": 400,
"detail": "Could not read document: N/A (through reference chain: de.name.supervisor.rest.domain.Task[\"author\"]->de.name.supervisor.rest.domain.User[\"assignedTasks\"]->java.util.HashSet[0]->de.name.supervisor.rest.domain.Task[\"author\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: N/A (through reference chain: de.name.supervisor.rest.domain.Task[\"author\"]->de.name.supervisor.rest.domain.User[\"assignedTasks\"]->java.util.HashSet[0]->de.name.supervisor.rest.domain.Task[\"author\"])","timeStamp": 1466859943472,
"developerMessage": "org.springframework.http.converter.HttpMessageNotReadableException",
"errors": {}
}
我不知道,什么是行不通的。 當我發布一個用戶時,我沒有任何問題。
Swagger-UI生成的示例JSON是:
{
"comments": [
"string"
],
"creationTime": 0,
"possibleTaskContainer": [
"string"
],
"author": {
"password": "string",
"creationTime": 0,
"createdTasks": [
{}
],
"id": 0,
"userName": "string",
"confirmed": true,
"email": "string",
"assignedTasks": [
{}
]
},
"sprint": {
"inProgress": [
{}
],
"creationTime": 0,
"endDate": {
"dayOfWeek": "MONDAY",
"month": "JANUARY",
"year": 0,
"dayOfMonth": 0,
"era": {
"value": 0
},
"dayOfYear": 0,
"monthValue": 0,
"chronology": {
"id": "string",
"calendarType": "string"
},
"leapYear": true
},
"allTasks": [
{}
],
"sprintName": "string",
"id": 0,
"toDos": [
{}
],
"done": [
{}
],
"startDate": {
"dayOfWeek": "MONDAY",
"month": "JANUARY",
"year": 0,
"dayOfMonth": 0,
"era": {
"value": 0
},
"dayOfYear": 0,
"monthValue": 0,
"chronology": {
"id": "string",
"calendarType": "string"
},
"leapYear": true
}
},
"taskContainer": "string",
"headLine": "string",
"taskType": "string",
"id": 0,
"possibleTaskTypes": [
"string"
],
"assignee": {
"password": "string",
"creationTime": 0,
"createdTasks": [
{}
],
"id": 0,
"userName": "string",
"confirmed": true,
"email": "string",
"assignedTasks": [
{}
]
},
"possibleworkFlowStati": [
"string"
],
"taskText": "string",
"status": "string"
}
可能是客戶端發送的JSON中的assingee和user對象只有id和Confirmed字段的問題? 如果這是原因,那么這將意味着我的控制器無法正常工作。 因此,此處為發布請求的控制器方法:
public HttpResponse postTask(Task task)throws ClientProtocolException, IOException{
HttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(TASK_URI_V1);
Gson gson = new Gson();
String json = gson.toJson(task);
logger.info("Request-Body created: "+json);
post.setEntity(new StringEntity(json));
post.setHeader("Content-type", "application/json");
HttpResponse response = client.execute(post);
logger.info("Response from Web-Service after executing postTask request: "+response.getStatusLine().toString());
logger.info("Response Head from Web-Service after executing postTask request: "+response.toString());
logger.info("Response Body from Web-Service after executing postTask request: "+RestControllerUtils.getResponseBodyAsString(response));
return response;
}
這是客戶端的用戶模型:
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
public User(){};
public User(int id){
setId(new Long(id));
}
private Long id;
private boolean confirmed;
private String email;
private String userName;
private String password;
private Long creationTime;
private Set<Task> assignedTasks;
private Set<Task> createdTasks;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public boolean isConfirmed() {
return confirmed;
}
public void setConfirmed(boolean confirmed) {
this.confirmed = confirmed;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Long getCreationTime() {
return creationTime;
}
public void setCreationTime(Long creationTime) {
this.creationTime = creationTime;
}
public Set<Task> getAssignedTasks() {
return assignedTasks;
}
public void setAssignedTasks(Set<Task> assignedTasks) {
this.assignedTasks = assignedTasks;
}
public void addAssignedTasks(Task task){
addAssignedTasks(task,true);
}
void addAssignedTasks(Task task, boolean set){
if(task != null){
getAssignedTasks().add(task);
if(set){
task.setAssignee(this);
}
}
}
public void removeAssidnedTask(Task task) {
getAssignedTasks().remove(task);
task.setAssignee(null);;
}
public Set<Task> getCreatedTasks() {
return createdTasks;
}
public void setCreatedTasks(Set<Task> createdTasks) {
this.createdTasks = createdTasks;
}
public void addCreatedTask(Task task){
addCreatedTask(task,true);
}
void addCreatedTask(Task task, boolean set){
if(task != null){
getCreatedTasks().add(task);
if(set){
task.setAuthor(this);
}
}
}
public void removeCreatedTask(Task task) {
getCreatedTasks().remove(task);
task.setAuthor(null);
}
}
以及服務器的用戶模型:
@Entity
@Table(name="User")
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property="@id", scope = User.class)
public class User {
@Id
@GeneratedValue
@Column(name="USER_ID")
private Long id;
@Column(name="CONFIRMATION")
private boolean confirmed;
@Column(name = "EMAIL",nullable = false)
private String email;
@Column(name = "USERNAME",nullable = false)
@NotNull
private String userName;
@Column(name="PASSWORD",nullable = false)
@NotNull
private String password;
@Column(name="TIMESTAMP")
private Long creationTime;
@OneToMany(cascade={CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH }, mappedBy="author",fetch=FetchType.EAGER)
private Set<Task>assignedTasks;
@OneToMany(cascade={CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH }, mappedBy="assignee",fetch=FetchType.EAGER)
private Set<Task>createdTasks;
public User() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Long getCreationTime() {
return creationTime;
}
public void setCreationTime(Long creationTime) {
this.creationTime = creationTime;
}
public boolean isConfirmed() {
return confirmed;
}
public void setConfirmed(boolean confirmed) {
this.confirmed = confirmed;
}
public Set<Task> getAssignedTasks() {
return assignedTasks;
}
public void setAssignedTasks(Set<Task> assignedTasks) {
this.assignedTasks = assignedTasks;
}
public void addAssignedTasks(Task task){
addAssignedTasks(task,true);
}
void addAssignedTasks(Task task, boolean set){
if(task != null){
getAssignedTasks().add(task);
if(set){
task.setAssignee(this);
}
}
}
public void removeAssidnedTask(Task task) {
getAssignedTasks().remove(task);
task.setAssignee(null);;
}
public Set<Task> getCreatedTasks() {
return createdTasks;
}
public void setCreatedTasks(Set<Task> createdTasks) {
this.createdTasks = createdTasks;
}
public void addCreatedTask(Task task){
addCreatedTask(task,true);
}
void addCreatedTask(Task task, boolean set){
if(task != null){
getCreatedTasks().add(task);
if(set){
task.setAuthor(this);
}
}
}
public void removeCreatedTask(Task task) {
getCreatedTasks().remove(task);
task.setAuthor(null);
}
@Override
public String toString() {
return "User [id=" + id + ", confirmed=" + confirmed + ", email=" + email + ", userName=" + userName
+ ", password=" + password + "]";
}
}
服務器的任務類:
@Entity
@Table(name="Task")
//@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property="@id", scope = Task.class)
public class Task {
@Id
@GeneratedValue
@Column(name="TASK_ID")
private Long id;
@Transient
private List<String> possibleTaskTypes = TaskType.getTaskTypesAsString();
@Transient
private List<String>possibleTaskContainer = TaskContainer.getTaskContainerAsString();
@Column(name="TASK_Container")
private String taskContainer;
@Column(name="TASK_TYPE")
private String taskType;
@Column(name="HEAD_LINE")
private String headLine;
@Column(name="TASK_TEXT")
private String taskText;
@Transient
private List<String> possibleworkFlowStati = WorkFlowStatus.getWorkFlowsStatiAsString();
@Column(name="WORKFLOW_STATUS")
private String status;
@ManyToOne(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH })
private User author;
@ManyToOne(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH }) //TODO Check wether remove too.
private User assignee;
@Column(name="COMMENTS")
@ElementCollection(targetClass=String.class)
private List<String>comments;
@ManyToOne(cascade=CascadeType.ALL)
private Sprint sprint;
@Column(name="TIMESTAMP")
private Long creationTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getHeadLine() {
return headLine;
}
public void setHeadLine(String headLine) {
this.headLine = headLine;
}
public String getTaskText() {
return taskText;
}
public void setTaskText(String taskText) {
this.taskText = taskText;
}
public User getAuthor() {
return author;
}
public void setAuthor(User author) {
setAuthor(author, true);
}
void setAuthor(User author, boolean add){
this.author = author;
if(author !=null&&add){
author.addCreatedTask(this, false);
}
}
public User getAssignee() {
return assignee;
}
public void setAssignee(User assignee) {
setAssignee(assignee,true);
}
void setAssignee(User assignee, boolean add){
this.assignee = assignee;
if(assignee != null && add){
assignee.addAssignedTasks(this,false);
}
}
public List<String> getComments() {
return comments;
}
public void setComments(List<String> comments) {
this.comments = comments;
}
public Sprint getSprint() {
return sprint;
}
public void setSprint(Sprint sprint) {
this.sprint = sprint;
}
public Long getCreationTime() {
return creationTime;
}
public void setCreationTime(Long creationTime) {
this.creationTime = creationTime;
}
public String getTaskType() {
return taskType;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
public List<String> getPossibleTaskTypes() {
return possibleTaskTypes;
}
public void setPossibleTaskTypes(List<String> possibleTaskTypes) {
this.possibleTaskTypes = possibleTaskTypes;
}
public List<String> getPossibleworkFlowStati() {
return possibleworkFlowStati;
}
public void setPossibleworkFlowStati(List<String> possibleworkFlowStati) {
this.possibleworkFlowStati = possibleworkFlowStati;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<String> getPossibleTaskContainer() {
return possibleTaskContainer;
}
public void setPossibleTaskContainer(List<String> possibleTaskContainer) {
this.possibleTaskContainer = possibleTaskContainer;
}
public String getTaskContainer() {
return taskContainer;
}
public void setTaskContainer(String taskContainer) {
this.taskContainer = taskContainer;
}
@Override
public String toString() {
return "Task [id=" + id + ", possibleTaskTypes=" + possibleTaskTypes + ", possibleTaskContainer="
+ possibleTaskContainer + ", taskContainer=" + taskContainer + ", taskType=" + taskType + ", headLine="
+ headLine + ", taskText=" + taskText + ", possibleworkFlowStati=" + possibleworkFlowStati + ", status="
+ status + ", author=" + author + ", assignee=" + assignee + ", comments=" + comments + ", sprint="
+ sprint + ", creationTime=" + creationTime + "]";
}
}
看起來您的JSON包含某種遞歸。
你有author
包含createTasks
和assignedTasks
,以及這些對象包括author
。
您可以使用Java Pojos提供服務器代碼嗎?
更新
我看到了Pojos,所以我認為您可以在這篇文章中找到一些線索。
你應該告訴傑克遜如何處理createTasks
和assignedTask
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.