이해가 안 돼요, 여기서 뭐가 잘못 됐나요? 날짜가 맞는 것 같습니다.
java.time.format.DateTimeParseException: Text '1971-04-29T00:00:00' could not be parsed at index 2
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
at org.springframework.format.datetime.standard.TemporalAccessorParser.parse(TemporalAccessorParser.java:75)
at org.springframework.format.datetime.standard.TemporalAccessorParser.parse(TemporalAccessorParser.java:46)
...
이 코드를 실행하면 작동하므로 일종의 Spring 문제라고 가정합니다.
LocalDateTime.parse("1971-04-29T00:00:00")
해당 스프링 컨트롤러 :
@Controller
@RequestMapping(produces = [MediaType.APPLICATION_JSON_VALUE])
class RecordController(
val recordRepository: RecordRepository
) {
@PostMapping("/records")
@ResponseBody
@ResponseStatus(value = HttpStatus.CREATED)
fun createRecord(
@RequestBody
record: RecordEntity
): RecordEntity {
return recordRepository.save(record)
}
@GetMapping("/records")
@ResponseBody
fun getRecords(
@RequestParam("from", required = false)
from: LocalDateTime?,
@RequestParam("to", required = false)
to: LocalDateTime?,
@RequestParam("client-type", required = false)
clientType: ClientType?
): Iterable<RecordEntity> {
var spec: Specification<RecordEntity> = where(null)!!
if (from != null)
spec = spec.andFrom(from)
if (to != null)
spec = spec.andTo(to)
if (clientType != null)
spec = spec.andClientTypeSpec(clientType)
return recordRepository.findAll(spec)
}
fun Specification<RecordEntity>.andFrom(from: LocalDateTime): Specification<RecordEntity> {
return and { root: Root<RecordEntity>, criteriaQuery: CriteriaQuery<*>?, criteriaBuilder: CriteriaBuilder ->
criteriaBuilder.greaterThan(root.get<LocalDateTime>("createdAt"), from)
} ?: this
}
fun Specification<RecordEntity>.andTo(to: LocalDateTime): Specification<RecordEntity> {
return and { root: Root<RecordEntity>, criteriaQuery: CriteriaQuery<*>?, criteriaBuilder: CriteriaBuilder ->
criteriaBuilder.lessThan(root.get<LocalDateTime>("createdAt"), to)
} ?: this
}
fun Specification<RecordEntity>.andClientTypeSpec(clientType: ClientType): Specification<RecordEntity> {
return and { root: Root<RecordEntity>, criteriaQuery: CriteriaQuery<*>?, criteriaBuilder: CriteriaBuilder ->
criteriaBuilder.equal(root.get<ClientType>("clientType"), clientType)
} ?: this
}
}
엔티티 객체 :
@Entity
@Table(name = "RECORDS")
class RecordEntity(
@Id @Column(name = "BOOKING_ID")
var bookingId: String,
@Column(name = "CLIENT")
@Enumerated(EnumType.STRING)
var clientType: ClientType,
@Column(name = "CREATED_AT", columnDefinition = "TIMESTAMP")
var createdAt: LocalDateTime
)
저장소는 다소 지루합니다.
@Repository
interface RecordRepository : CrudRepository<RecordEntity, String>, JpaSpecificationExecutor<RecordEntity> {
}
나머지 전화 :
curl --location --request GET 'localhost:8080/records?to=1971-04-29T00:00:00'
문제의 원인이 확실하지 않으므로 모든 코드를 포함했습니다. 도움을 주셔서 감사합니다 :)
Spring에는 숫자 및 날짜와 같은 JDK 유형에 대한 다양한 변환 유틸리티가 있습니다.
특히 Spring Boot는 Spring MVC 웹 인프라를 설정하기 위해 .NET DateTimeFormatterRegistrar
의 날짜 유형에 대해 다양한 포맷터를 등록하는 데 사용 합니다 java.time
.
이 글을 쓰는 시점에서에는를 LocalDateTime
사용합니다.
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
내 시스템의 Locale
경우 다음 DateTimeFormatter
과 같은 형식을 생성합니다.
12/19/20, 8:45 PM
당신의 실수로
Text '1971-04-29T00:00:00' could not be parsed at index 2
나는 그것이 파싱을 위해 똑같이한다고 가정합니다 : 인덱스 2는 /
.
직접 등록하는 것과 같이 여러 가지 방법으로이 문제를 해결할 수 있습니다 DateTimerFormatterRegistrar
. 제 생각에 가장 쉬운 해결책은 매개 변수에 적절한 @DateTimeFormat
. 예를 들면
@RequestParam @DateTimeFormat(iso = ISO.DATE_TIME) LocalDateTime to
이것은 Spring MVC가 DateTimeFormatter
날짜 시간 문자열을 파싱 할 수 있는 별도의 인스턴스 를 사용하도록 강제 합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다