Spring загрузочный API-вызов с несколькими @RequestParam - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно найти записи между диапазонами дат и я хотел бы сделать вызов GET в Spring Boot API следующим образом:

$ curl -X GET http://localhost:8080/api/v1/appointments/findWithRange?start=2018-10-01&end=2018-10-15

Я пишу вызов GET,

@GetMapping("/findWithRange")
    public ResponseEntity<List<Appointment>> findAllWithCreationRange(@RequestParam("start")  Date start, @RequestParam("end") Date end) {

        List<Appointment> appointments = service.findAllWithCreationRange(start, end);

        if (Objects.isNull(appointments)) {
            ResponseEntity.badRequest().build();
        }

        return ResponseEntity.ok(appointments);
    }

Я получаю ответный ответ,

{"timestamp":"2019-02-10T07:58:22.151+0000","status":400,"error":"Bad Request","message":"Required Date parameter 'end' is not present","path":"/api/v1/appointments/findWithRange"}

Как правильно написать вызов?Кажется, я не смог отладить, поскольку точки останова не улавливаются.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Вы должны указать @ DateTimeFormat

Здесь Вы можете найти более подробную информацию

0 голосов
/ 10 февраля 2019

Ваша проблема очень проста - в вашем вызове

$ curl -X GET http://localhost:8080/api/v1/appointments/findWithRange?start=2018-10-01&end=2018-10-15

& знак скажите операционная система ' запустить curl -X GET http://localhost:8080/api/v1/appointments/findWithRange?start=2018-10-01 в фоновом режиме '.По этой причине дата end не определена.

Просто заключите ваш URL в двойные кавычки:

$ curl -X GET "http://localhost:8080/api/v1/appointments/findWithRange?start=2018-10-01&end=2018-10-15"
0 голосов
/ 10 февраля 2019

Если вы хотите получить параметр в качестве даты, тогда нужно определить шаблон.Попробуйте с этим:

@GetMapping("/findWithRange")
    public ResponseEntity<List<Appointment>> findAllWithCreationRange(@RequestParam("start") @DateTimeFormat(pattern = "yyyy-MM-dd") Date start, @RequestParam("end") @DateTimeFormat(pattern = "yyyy-MM-dd") Date end) {

        List<Appointment> appointments = service.findAllWithCreationRange(start, end);

        if (Objects.isNull(appointments)) {
            ResponseEntity.badRequest().build();
        }

        return ResponseEntity.ok(appointments);
    }

Если вы хотите получить sql.Date, то необходимо использовать пользовательский десериализатор.Попробуйте это:

@GetMapping("/findWithRange")
        public ResponseEntity<List<Appointment>> findAllWithCreationRange(@RequestParam("start") @JsonDeserialize(using = SqlDateConverter.class) Date start, @RequestParam("end") @JsonDeserialize(using = SqlDateConverter.class) Date end) {

            List<Appointment> appointments = service.findAllWithCreationRange(start, end);

            if (Objects.isNull(appointments)) {
                ResponseEntity.badRequest().build();
            }

            return ResponseEntity.ok(appointments);
        }

Sql конвертер даты:

public class SqlDateConverter extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return Date.valueOf(p.getText());
    }
}

Если вы хотите десериализовать sql.Date глобально, попробуйте добавить только этот компонент:

@Bean
    public Jackson2ObjectMapperBuilder configureObjectMapper() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Date.class,new SqlDateConverter());
        objectMapper.registerModule(module);
        builder.configure(objectMapper);
        return builder;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...