首页 > 解决方案 > 通过 LocalDateFilter 弹簧休息控制器时收到错误请求

问题描述

/api/test?page=-1&size=50&nextDateOfScreening.greaterThan=2020-04-03&sort=id,asc

这是我传递的 url,在控制器中接收它,

@GetMapping("/test")
    public ResponseEntity<List<ExampleDTO>> getAllTIBenScrDetails(ExampleCriteria criteria, Pageable pageable) {
        Page<ExampleDTO> page = tIBenScrDetailsQueryService.findByCriteria(criteria, pageable);
        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
        return ResponseEntity.ok().headers(headers).body(page.getContent());
    }

ExampleCriteria类为,

public class ExampleCriteria implements Serializable, Criteria {
    private LocalDateFilter nextDateOfScreening; //jhipster LocalDateFilter
}                                                                         

我对日期过滤器的请求很糟糕,

Field error in object 'ExampleCriteria' on field 'nextDateOfScreening.greaterThan': rejected value [2020-04-03]; codes [typeMismatch.ExampleCriteria.nextDateOfScreening.greaterThan,typeMismatch.nextDateOfScreening.greaterThan,typeMismatch.greaterThan,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [ExampleCriteria.nextDateOfScreening.greaterThan,nextDateOfScreening.greaterThan]; arguments []; default message [nextDateOfScreening.greaterThan]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'nextDateOfScreening.greaterThan'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.time.LocalDate] for value '2020-04-03'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2020-04-03]]

对于greaterThanEqualslessThanEquals错误请求错误不会得到,但是对于greaterThanlessThan错误是存在的。谁能帮我解决这个问题?

标签: javaspringpostmanjhipsterspring-restcontroller

解决方案


首先greaterThanEquals不存在于LocalDateFilter. 其实是greaterOrEqualThan这样 nextDateOfScreening.greaterOrEqualThan

这就是它“工作”的原因,因为 spring 没有找到LocalDateFiltersetter 并因此创建了一个 "empty" LocalDateFilter

因为lessThan找到了 setter,但未配置Stringto的转换。LocalDate为了解决这个问题,您必须声明一个自定义转换器->

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@Component
public class LocalDateConverter implements Converter<String, LocalDate> {

    @Override
    public LocalDate convert(final String s) {
        return LocalDate.parse(s, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }
}

推荐阅读