Я пытаюсь отправить запрос от Postman в Tomcat v9.0 и десериализовал необработанные данные (вот строка JSON) в 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 v9.0
В /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);
}
}
В /HealthHelper/src/main/java/vo/DietDiary.java
Класс, который удовлетворяет правилу 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 + "]";
}
}
В /HealthHelper/src/main/java/util/gson/GsonForSqlDateAndSqlTime.java
Я помещаю экземпляр 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();
}
В /HealthHelper/src/main/java/util/gson/deserializer/JsonDeserializerForSqlDate.java
Код: Выделить всё
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);
}
}
};
}
В /HealthHelper/src/main/java/util/gson/deserializer/JsonDeserializerForSqTime.java
Код: Выделить всё
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