введение
Почему даты иногда не совпадают? Значение типа java.sql.Date, полученное от сервера Postman, затем десериализуется с помощью com.google.gson.Gson (и перед созданием экземпляра Gson я регистрирую два адаптера - один для десериализации java.sql.Date, другой для десериализации java.sql.Time.). И строка json, отправленная с сервера.
Я пытаюсь отправить запрос от Postman в Tomcat v9.0 и десериализовал необработанные данные (вот json string) в объект DietDiary, который содержит два поля типа java.sql.Date и java.sql.Time, используя пакет com.google.gson.
Два ключа необработанных данных запроса в Postman.
Код: Выделить всё
"createDate":"2022-05-05",
"createTime":"12:00:00",

Но консоль в Eclipse печатает
Код: Выделить всё
Ready to deserialize.
dietDiary:DietDiary [diaryId=2, userId=2, createDate=2021-12-26, createTime=00:00:00, totalFat=2.52, totalCarbon=2.3, totalProtein=2.1, totalFiber=2.1, totalSugar=1.2, totalSodium=1.1, totalCalories=1.21]
подробная информация
Вот подробная информация.
сервер
имя
Код: Выделить всё
Postman
Код: Выделить всё
GET
url
Код: Выделить всё
http://localhost:8080/HealthHelper/dietDiary/test
необработанные данные
Строка JSON.Код: Выделить всё
{
"diaryId":2,
"userId":2,
"createDate":"2022-05-05",
"createTime":"12:00:00",
"totalFat":2.52,
"totalCarbon":2.3,
"totalProtein":2.1,
"totalFiber":2.1,
"totalSugar":1.2,
"totalSodium":1.1,
"totalCalories":1.21
}
Код: Выделить всё
Tomcat
Код
В /HealthHelper/src/main/java/controller/TestController.java< /код>
Код: Выделить всё
package controller;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.sql.Date;
import java.sql.Time;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import constant.SqlDatePattern;
import constant.SqlTimePattern;
import util.gson.GsonForSqlDateAndSqlTime;
import util.gson.deserializer.JsonDeserializerForSqTime;
import util.gson.deserializer.JsonDeserializerForSqlDate;
import vo.DietDiary;
@WebServlet("/dietDiary/test")
public class TestController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
Gson gson = GsonForSqlDateAndSqlTime.gson;
DietDiary dietDiary = gson.fromJson(req.getReader(), DietDiary.class);
System.out.println("Ready to deserialize.");
System.out.println("dietDiary:"+dietDiary);
}
}
Класс, который удовлетворяет правилу JavaBean и не может быть загрязнено.
Код: Выделить всё
package vo;
import java.sql.Date;
import java.sql.Time;
public class DietDiary {
private int diaryId;
private int userId;
private Date createDate;
private Time createTime;
private Double totalFat;
private Double totalCarbon;
private Double totalProtein;
private Double totalFiber;
private Double totalSugar;
private Double totalSodium;
private Double totalCalories;
public int getDiaryId() {
return diaryId;
}
public void setDiaryId(int diaryId) {
this.diaryId = diaryId;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public Time getCreateTime() {
return createTime;
}
public void setCreateTime(Time createTime) {
this.createTime = createTime;
}
public Double getTotalFat() {
return totalFat;
}
public void setTotalFat(Double totalFat) {
this.totalFat = totalFat;
}
public Double getTotalCarbon() {
return totalCarbon;
}
public void setTotalCarbon(Double totalCarbon) {
this.totalCarbon = totalCarbon;
}
public Double getTotalProtein() {
return totalProtein;
}
public void setTotalProtein(Double totalProtein) {
this.totalProtein = totalProtein;
}
public Double getTotalFiber() {
return totalFiber;
}
public void setTotalFiber(Double totalFiber) {
this.totalFiber = totalFiber;
}
public Double getTotalSugar() {
return totalSugar;
}
public void setTotalSugar(Double totalSugar) {
this.totalSugar = totalSugar;
}
public Double getTotalSodium() {
return totalSodium;
}
public void setTotalSodium(Double totalSodium) {
this.totalSodium = totalSodium;
}
public Double getTotalCalories() {
return totalCalories;
}
public void setTotalCalories(Double totalCalories) {
this.totalCalories = totalCalories;
}
public boolean equals(Object object) {
if(object instanceof DietDiary) {
return false;
}
DietDiary dietDiary = (DietDiary) object;
if(!(this.getDiaryId() == dietDiary.getDiaryId())) {
return false;
}
if(!(this.getUserId() == dietDiary.getUserId())) {
return false;
}
if(!(this.getCreateDate() == dietDiary.getCreateDate())) {
return false;
}
if(!(this.getCreateTime() == dietDiary.getCreateTime())) {
return false;
}
return true;
}
@Override
public String toString() {
return "DietDiary [diaryId=" + diaryId + ", userId=" + userId + ", createDate=" + createDate + ", createTime="
+ createTime + ", totalFat=" + totalFat + ", totalCarbon=" + totalCarbon + ", totalProtein="
+ totalProtein + ", totalFiber=" + totalFiber + ", totalSugar=" + totalSugar + ", totalSodium="
+ totalSodium + ", totalCalories=" + totalCalories + "]";
}
}
Я помещаю экземпляр gson, адаптеры регистрируются для десериализованных java.sql.Date и java.sql.Time в общедоступном классе GsonForSqlDateAndSqlTime
Код: Выделить всё
package util.gson;
import java.sql.Date;
import java.sql.Time;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import util.gson.deserializer.JsonDeserializerForSqTime;
import util.gson.deserializer.JsonDeserializerForSqlDate;
public class GsonForSqlDateAndSqlTime {
public static Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, JsonDeserializerForSqlDate.dateDeserializer)
.registerTypeAdapter(Time.class, JsonDeserializerForSqTime.timeDeserializer)
.create();
}
Код: Выделить всё
package util.gson.deserializer;
import java.lang.reflect.Type;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import constant.SqlDatePattern;
public class JsonDeserializerForSqlDate {
public static JsonDeserializer dateDeserializer = new JsonDeserializer() {
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat(SqlDatePattern.sqlDatePattern);
try {
return new Date(dateFormat.parse(json.getAsString()).getTime());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
};
}
Код: Выделить всё
package util.gson.deserializer;
import java.lang.reflect.Type;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import constant.SqlTimePattern;
public class JsonDeserializerForSqTime {
public static JsonDeserializer timeDeserializer = new JsonDeserializer() {
@Override
public Time deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
SimpleDateFormat timeFormat = new SimpleDateFormat(SqlTimePattern.sqlTimePattern);
try {
return new Time(timeFormat.parse(json.getAsString()).getTime());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
};
}
Я прочитал эти документы.
- API интерфейса JsonDeserializer в пакете com.google.gson
Подробнее здесь: https://stackoverflow.com/questions/791 ... ved-from-s