Вызов Rest API возвращает ошибку с LocalDate - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь сделать api-вызов rest, но продолжает получать 400 Bad Request.Из журналов кажется, что есть проблема с одним из полей LocalDate моего POJO.

Мой POJO:

public class MyObj implements Serializable {
private Long id;
private String remark;
private LocalDate someDate;
...other fields, getter and setter

В моем main()

MyObj myObj = new MyObj();
myObj .setRemark("My test case");
myObj .setSomeDate( LocalDate.now());
...

 WebResource webResource = client
                .resource("my_url");

        webResource
                .header("apikey", "mykey")
                .accept("application/json")
                .type("application/json")
                .post(MyObj.class, myObj );

Запустив приведенный выше код, я получаю следующую ошибку: Bad Request: JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Expected array or string. at [Source: (PushbackInputStream); line: 1, column: 159] (through reference chain: com.xxx.MyObj["someDate"])

Есть идеи, почему это произошло?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

LocalDate должен быть преобразован в строку при сериализации и преобразован обратно в LocalDate при десериализации.Для этого вы можете использовать @JsonDeserialize и @JsonSerialize для свойства объекта (ов) LocalDate

@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate someDate;

Для получения дополнительной информации перейдите по этой ссылке: https://kodejava.org/how-to-format-localdate-object-using-jackson

Другой способ заключается виспользовать ObjectMapper и зарегистрировать модуль JavaTimeModule()

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

Пример использования ObjectMapper и аналогичная проблема: https://groups.google.com/forum/#!topic/jackson-user/XdHvRKG1vhY

0 голосов
/ 06 июня 2019

Вы должны аннотировать свою LocalDate, чтобы сообщить, как она должна быть преобразована в строку. Вот фрагмент для ZonedDateTime, но все, что вам нужно сделать, это изменить маску, чтобы она соответствовала LocalDate.

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public ZonedDateTime getTime() {
    return time;
}

Вот ссылка на оригинальный вопрос: Spring Data JPA - формат ZonedDateTime для сериализации json

...