我正在为一个项目工作,我在反序列化某些对象时遇到了一些麻烦。我正在实现客户端 - 服务器通信,我必须在进程之间传递一些JSON。我正在通过流发送 AppointmentDto 类的列表。
我有类 AppointmentDto ,它看起来像: package project.serverSide.server.bussiness;
import java.sql.Date;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class AppointmentDto {
StringProperty DoctorName;
StringProperty PatientName;
ObjectProperty<Date> dateIssued;
public StringProperty getDoctorName() {
return DoctorName;
}
public void setDoctorName(StringProperty doctorName) {
DoctorName = doctorName;
}
public StringProperty getPatientName() {
return PatientName;
}
public void setPatientName(StringProperty patientName) {
PatientName = patientName;
}
public ObjectProperty<Date> getDateIssued() {
return dateIssued;
}
public void setDateIssued(SimpleObjectProperty<Date> simpleObjectProperty) {
this.dateIssued = simpleObjectProperty;
}
@JsonCreator
public AppointmentDto(@JsonProperty("doctor") String doctorName,@JsonProperty("patient") String patientName,@JsonProperty("dateIssued") Date dateIssued) {
super();
DoctorName = new SimpleStringProperty(doctorName);
PatientName = new SimpleStringProperty(patientName);
this.dateIssued = new SimpleObjectProperty<Date>(dateIssued);
}
public AppointmentDto() {
super();
}
}
我有 ApplicationClient ,它反序列化该列表
package project.eHealth;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import project.serverSide.server.Request;
import project.serverSide.server.Response;
import project.serverSide.server.bussiness.AppointmentDto;
@Component
public class ApplicationClient implements Runnable {
BufferedReader in;
PrintWriter out;
String name;
DoctorViewController doctorCtrl;
PatientViewController patientCtrl;
ObjectMapper mapper;
public ApplicationClient(){
}
public void run() {
// Make connection and initialize streams
String serverAddress = "127.0.0.1";
Socket socket;
try {
socket = new Socket(serverAddress, 9001);
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
mapper = new ObjectMapper();
Request r = new Request();
r.setRequester("name");
r.setCommand("getAllAppointments");
try {
String req = mapper.writeValueAsString(r);
System.out.println(req);
out.println(req);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Process all messages from server, according to the protocol.
while (true) {
try {
String line = in.readLine();
Response resp = mapper.readValue(line,Response.class);
if (resp.getAction().equals("RETURNED")){
System.out.println(resp.getData());
ArrayList<AppointmentDto> appointmentsList = mapper.readValue(resp.getData(), new TypeReference<ArrayList<AppointmentDto>>(){});
for (AppointmentDto ap : appointmentsList){
System.out.println(ap.getDoctorName()+" "+ap.getPatientName());
}
//doctorCtrl.setAppointmentsList(appointmentsList);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
响应类如下所示:
package project.serverSide.server;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Response {
private String action;
private String data;
public Response() {
super();
}
@JsonCreator
public Response(@JsonProperty("action") String action,@JsonProperty("data") String data) {
super();
this.action = action;
this.data = data;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
堆栈跟踪是:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.sql.Date out of START_OBJECT token
at [Source: [{"dateIssued":{"value":null,"bean":null,"name":"","bound":false},"patientName":{"value":"Pop Ioan","bean":null,"name":"","bound":false,"valueSafe":"Pop Ioan"},"doctorName":{"value":"Mihai Georgescu","bean":null,"name":"","bound":false,"valueSafe":"Mihai Georgescu"}},{"dateIssued":{"value":null,"bean":null,"name":"","bound":false},"patientName":{"value":"Popescu Mioara","bean":null,"name":"","bound":false,"valueSafe":"Popescu Mioara"},"doctorName":{"value":"Mihai Georgescu","bean":null,"name":"","bound":false,"valueSafe":"Mihai Georgescu"}}]; line: 1, column: 16] (through reference chain: java.util.ArrayList[0]->project.serverSide.server.bussiness.AppointmentDto["dateIssued"])
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseDate(StdDeserializer.java:800)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:172)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer.deserialize(DateDeserializers.java:282)
at com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer.deserialize(DateDeserializers.java:267)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:511)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:400)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1191)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:314)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:287)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:259)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2861)
at project.eHealth.ApplicationClient.run(ApplicationClient.java:76)
at java.lang.Thread.run(Thread.java:745)
感谢任何形式的帮助!