нет конструктора аргумента строки / метода фабрики для десериализации из значения String ('2018-12-14') - PullRequest
0 голосов
/ 14 декабря 2018

Этот вопрос почти такой же, как этот один, но он отличается тем, что я пытаюсь получить String to LocalDate.Ошибка STS:

2018-12-14 00: 47: 04.507 WARN 6216 --- [nio-8080-exec-2] .wsmsDefaultHandlerExceptionResolver: Resolved [org.springframework.http.converter.HttpMessageNotReadableException: ошибка синтаксического анализа JSON: Невозможно создать экземпляр java.time.LocalDate: нет конструктора аргумента String / метода фабрики для десериализации из значения String ('2018-12-14');Вложенное исключение: com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр java.time.LocalDate: нет конструктора аргумента String / метода фабрики для десериализации из значения String ('2018-12-14') в [Source:java.io.PushbackInputStream@73ff9989;строка: 3, столбец: 16] (через цепочку ссылок: com.xxxxx.xxxxxx.model.request.ReservationRequest ["checkin"])]

а вот от Почтальона:

{"отметка времени": 1544744824516, "статус": 400, "ошибка": "неверный запрос", "исключение": "org.springframework.http.converter.HttpMessageNotReadableException", "message": "анализ JSONошибка: невозможно создать экземпляр java.time.LocalDate: нет конструктора аргумента String / метода фабрики для десериализации из значения String ('2018-12-14'); вложенное исключение - com.fasterxml.jackson.databind.JsonMappingException: Canне создавать экземпляр java.time.LocalDate: нет конструктора аргумента String / метода фабрики для десериализации из значения String ('2018-12-14') \ n в [Source: java.io.PushbackInputStream@73ff9989; строка: 3,столбец: 16] (через цепочку ссылок: com.xxxxx.xxxxx.model.request.ReservationRequest [\ "checkin \"]) "," путь ":" / room / booking / v1 "}

И запрос POST был:

{
    "id": 12345,
    "checkin": "2018-12-14",
    "checkout": "2018-12-17"
}

Где соответствующие классыявляются:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

@Configuration
public class ApiConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        return new ObjectMapper();
    }

    @Bean
    public ObjectWriter objectWriter(ObjectMapper objectMapper) {
        return objectMapper.writerWithDefaultPrettyPrinter();
    }
}

и

import java.time.LocalDate;
import org.springframework.format.annotation.DateTimeFormat;

public class ReservationRequest {

    private Long id;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkin;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkout;

    public ReservationRequest() {
        super();
    }

    public ReservationRequest(Long id, LocalDate checkin, LocalDate checkout) {
        super();
        this.id = id;
        this.checkin = checkin;
        this.checkout = checkout;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public LocalDate getCheckin() {
        return checkin;
    }

    public void setCheckin(LocalDate checkin) {
        this.checkin = checkin;
    }

    public LocalDate getCheckout() {
        return checkout;
    }

    public void setCheckout(LocalDate checkout) {
        this.checkout = checkout;
    }
}

и

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.xxxxx.xxxxxx.model.request.ReservationRequest;
import com.xxxxx.xxxxxx.model.response.ReservationResponse;

@RestController
@RequestMapping(ResourceConstants.ROOM_RESERVATION_V1)
public class ReservationResource {

    @RequestMapping(path = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<ReservationResponse> getAvaiableRooms(
            @RequestParam(value = "checkin") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate checkin,
            @RequestParam(value = "checkout") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate checkout) {
        return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
    }

    @RequestMapping(path = "", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<ReservationResponse> createReservation(@RequestBody ReservationRequest reservationRequest) {

        return new ResponseEntity<>(new ReservationResponse(), HttpStatus.CREATED);
    }

    @RequestMapping(path = "", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<ReservationResponse> updateReservation(@RequestBody ReservationRequest reservationRequest) {

        return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
    }

    @RequestMapping(path = "/{reservationId}", method = RequestMethod.DELETE)
    public ResponseEntity<Void> deleteReservation(@PathVariable long reservationId) {

        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }
}

Я включил импорт на всякий случай.

В любом случае, если яизмените ReservationRequest, чтобы в нем были поля со строками вместо LocalDate, как это, тогда это не приведет к ошибке

public class ReservationRequest {

    private Long id;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private String checkin;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private String checkout;

    public ReservationRequest() {
        super();
    }

    public ReservationRequest(Long id, String checkin, String checkout) {
        super();
        this.id = id;
        this.checkin = checkin;
        this.checkout = checkout;
    }

(getters and setters updated as well)

JDK 1.8;springBootVersion = '1.5.17.RELEASE';имя: 'jackson-datatype-jsr310', версия: '2.9.7'

Вопрос в том, почему он не работает должным образом с LocalDate ?

ОБНОВЛЕНИЕ:попробовал эти решения и добавил @JsonSerialize и @JsonDeserialize, так как ни objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);, ни objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

не работали так, что теперь это выглядит так:

public class ReservationRequest {

    private Long id;
    @JsonSerialize(using = ToStringSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    //@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkin;
    @JsonSerialize(using = ToStringSerializer.class)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    //@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate checkout;

    public ReservationRequest() {
        super();
    }

Теперь, похоже, это работает, но я не знаю, хорошее ли это решение?

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Я недавно столкнулся с той же проблемой, и причина этой ошибки заключалась в двойных кавычках вокруг строки json, которые при удалении работали отлично

0 голосов
/ 25 марта 2019

Я думаю, что уже слишком поздно, чтобы я мог ответить на сообщение. Я столкнулся с той же проблемой, что аннотация ниже была полезна.

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate dateOfBirth;

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...