Spring MVC 세션 속성
1. 문제
Date, LocalDate 및 LocalDateTime 매개 변수를 허용하는 세 가지 메서드가 있는 컨트롤러를 확인한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
public class DateTimeController {
@PostMapping("/date")
public void date(@RequestParam("date") Date date) {
// ...
}
@PostMapping("/localdate")
public void localDate(@RequestParam("localDate") LocalDate localDate) {
// ...
}
@PostMapping("/localdatetime")
public void dateTime(@RequestParam("localDateTime") LocalDateTime localDateTime) {
// ...
}
}
ISO 8601에 따라 형식이 지정된 매개변수를 사용하여 해당 메서드에 POST 요청을 보내면 예외가 발생한다.
예를 들어, “2018-10-22”를 /date 엔드포인트로 보내면 다음과 유사한 메시지와 함께 잘못된 요청 오류가 발생한다.
1
2
Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate';
nested exception is org.springframework.core.convert.ConversionFailedException.
이는 기본적으로 Spring이 문자열 매개변수를 날짜 또는 시간 객체로 변환할 수 없기 때문이다.
2. 요청 수준에서 날짜 매개변수 변환
이 문제를 처리하는 방법 중 하나는 매개변수에 @DateTimeFormat
주석을 추가하고 형식 지정 패턴 매개변수를 제공하는 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
public class DateTimeController {
@PostMapping("/date")
public void date(@RequestParam("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {
// ...
}
@PostMapping("/local-date")
public void localDate(@RequestParam("localDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
// ...
}
@PostMapping("/local-date-time")
public void dateTime(@RequestParam("localDateTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
// ...
}
}
이렇게 하면 문자열이 ISO 8601 형식을 사용하여 형식화되는 경우 문자열이 날짜 개체로 올바르게 변환된다.
@DateTimeFormat
주석에 패턴 매개변수를 제공하여 자체 변환 패턴을 사용할 수도 있다.
1
2
3
4
@PostMapping("/date")
public void date(@RequestParam("date") @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
// ...
}
3. 애플리케이션 수준에서 날짜 매개변수 변환
Spring에서 날짜 및 시간 객체 변환을 처리하는 또 다른 방법은 전역 구성을 제공하는 것이다. 공식 문서에 따라 WebMvcConfigurationSupport 구성 및 해당 mvcConversionService 메서드를 확장해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class DateTimeConfig extends WebMvcConfigurationSupport {
@Bean
@Override
public FormattingConversionService mvcConversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);
DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy"));
dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
dateTimeRegistrar.registerFormatters(conversionService);
DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();
dateRegistrar.setFormatter(new DateFormatter("dd.MM.yyyy"));
dateRegistrar.registerFormatters(conversionService);
return conversionService;
}
}
먼저 false 매개변수를 사용하여 DefaultFormattingConversionService를 생성한다. 이는 Spring이 기본적으로 어떤 포맷터도 등록하지 않음을 의미한다.
그런 다음 날짜 및 날짜-시간 매개변수에 대한 사용자 정의 형식을 등록해야 한다. 두 개의 사용자 정의 형식 등록 기관을 등록하여 이를 수행한다. 첫 번째 항목인 DateTimeFormatterRegistar는 LocalDate 및 LocaDateTime 개체의 구문 분석을 담당한다. 두 번째 항목인 DateFormattingRegistrar는 Date 개체를 처리한다.
4. 속성 파일에서 날짜-시간 구성
Spring은 또한 애플리케이션 속성 파일을 통해 전역 날짜-시간 형식을 설정하는 옵션을 제공한다. 날짜, 날짜-시간 및 시간 형식에 대한 세 가지 개별 매개변수가 있다.
spring.mvc.format.date=yyyy-MM-dd
spring.mvc.format.date-time=yyyy-MM-dd HH:mm:ss
spring.mvc.format.time=HH:mm:ss
이러한 매개변수는 모두 iso 값으로 대체될 수 있다. 예를 들어 날짜-시간 매개변수를 다음과 같이 설정한다.
spring.mvc.format.date-time=iso
ISO-8601 형식과 동일하다.
spring.mvc.format.date-time=yyyy-MM-dd HH:mm:ss