Почему Spring JPA переводит действительную дату в неузнаваемую отформатированную строку? - PullRequest
1 голос
/ 09 июля 2019

Я установил приложение Spring Microservice с конечной точкой POST, которая принимает объект RequestBody, который содержит поле «java.util.Date».Из моего другого приложения, когда я отправляю запрос к этой конечной точке POST, Дата в JSON выглядит хорошо, в формате «2019-06-20T13: 33: 47.487-07: 00», но когда мой микросервис получает запрос,он преобразует строку даты в следующее: «20 июня 2019 13:33:47» и сообщает мне: «Невозможно десериализовать значение типа java.util.Date из строки» 20 июня 2019: 33: 47: недопустимое представление ".

Я поиграл с разными аннотациями, включая" ​​@Temporal (TemporalType.TIMESTAMP) "и" @DateTimeFormat (iso = DateTimeFormat.ISO.DATE_TIME) ".Также попытался установить JSONFormat вручную, но это не является исправлением, поскольку строка даты ввода как-то где-то интерпретируется.

Вот конечная точка POST микросервиса:

@PostMapping(path = "/orders/create")
public ResponseEntity createOrder(@RequestBody final HubOrder hubOrder) {
    List<OrderLineitem> orderLineitem = orderService.hubOrderToOrderLineitems(hubOrder);
    repository.saveAll(orderLineitem);
    return ResponseEntity.created().build();
}

И bean:

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class HubOrder {
    private BigInteger id; 
    private Date created; 
    private String lastModifiedBy; 
    private List<HubLineitem> lineitems;
}

И я ударил конечную точку из моего приложения следующим образом:

HubOrder hubOrder = createHubOrderFromOrder(order);
Gson gson = new Gson();
HttpPost request = new HttpPost("http://localhost:8888/orders/create");
StringEntity params = new StringEntity(gson.toJson(hubOrder));
HttpClient httpClient = HttpClientBuilder.create().build();


request.addHeader("content-type", "application/json");
request.setEntity(params);
HttpResponse response = httpClient.execute(request);

Где hubOrder.getCreated () == "2019-06-20T13: 33: 47.487-07: 00«

Ошибка от моего микросервиса:« 2019-07-08 20: 50: 47.663 WARN 2400 --- [nio-8888-exec-2] .wsmsDefaultHandlerExceptionResolver: Resolved [org.springframework.http.converter.HttpMessageNotReadableException: ошибка синтаксического анализа JSON: невозможно десериализовать значение типа java.util.Date из строки «20 июня 2019 13:33:47 вечера»: недопустимое представление (ошибка: не удалось проанализировать значение даты »20 июня 2019 1:33: 47 PM ': Неразборчивая дата: "20 июня 2019 13:33:47"); вложенное исключение - com.fasterxml.jackson.databind.exc.InvalidFormatException: Невозможно десериализовать значение типа java.util.Date из String "20 июня, 2019 13:33:47 ": недопустимое представление (ошибкаили: Не удалось проанализировать значение даты '20 июня 2019 г. 13:33:47': не разбирается дата: "20 июня 2019 г. 13:33:47") "

Ответы [ 2 ]

1 голос
/ 09 июля 2019

вы должны написать функцию setCreated () и посмотреть ввод, после чего использовать jsonFormat для его преобразования: D

1 голос
/ 09 июля 2019

Пожалуйста, попробуйте аннотировать ваше поле Date created в HubOrder следующим текстом:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MMM dd, yyyy hh:mm:ss aaa")
private Date created

Десериализация ожидает в разных форматах по умолчанию, в зависимости от конфигурации, и, похоже, ваш языковой стандарт влияет на это, как описано здесь . Чтобы настроить поведение, вы должны использовать аннотацию выше. Или, чтобы применить это во всех случаях, сделайте следующее:

  • создайте экземпляр gson по следующей схеме:

    Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
        .create();
    
  • или передать пользовательский адаптер для Date типов

    public class GsonDateAdapter implements JsonSerializer<Date>,JsonDeserializer<Date> {
    
        private final DateFormat dateFormat;
    
        public GsonUTCDateAdapter() {
          dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        }
    
        @Override public synchronized JsonElement serialize(Date date,Type type,JsonSerializationContext jsonSerializationContext) {
            return new JsonPrimitive(dateFormat.format(date));
        }
    
        @Override public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) {
          try {
            return dateFormat.parse(jsonElement.getAsString());
          } catch (ParseException e) {
            throw new JsonParseException(e);
          }
        }
    }
    

    1021 * тогда *

    Gson gson = new GsonBuilder()
                   .registerTypeAdapter(Date.class, new GsonDateAdapter())
                   .create();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...