Post
KO

String dateFormat 변환 관련. Jackson Deserialize

@Pathvariable 형태의 파라미터등을 date type으로 받으려면 converter를 시켜줄 설정 및 class가 필요하다.

우선 @PathVariable 부분을 변경하는 부분은 아래와 같다.

Paramter를 받는 @Controller 클래스 안에 아래와 같이 선언한다.

@InitBinder public void initBind(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, "memoTsp", new CustomDateEditor(dateFormat, true)); }

중요한 부분은 date type 형태는 yyyy.MM.dd 형태는 짤리니 사용하면 안되고 위와 같이 yyyy-mm-dd 나 기타 mmddYY등을 사용하면 정상적으로 되는 것 같다.

@RestController public Class RestController { @RequestMapping(value ="/test/{testDate}") public String testContoller(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date testDate) { ~~~ return ""; } @InitBinder public void initBind(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, "testDate", new CustomDateEditor(dateFormat, true)); } }

이후 @RequestBody 받는 부분에서는 @JsonDeserialize(using = CustomJsonDateDeserializer.class) 애노테이션을 이용하여 testDate 변수 위에 걸어 둔다.

그렇게 하면 @RequestBody로 받을 때 데이터 알맞게 들어가지게 된다.

@RestController public Class RestController { @RequestMapping(value ="/test/{testDate}") public String testContoller(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date testDate, @RequestBody TestModel testModel) { ~~~ return ""; } @InitBinder public void initBind(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); binder.registerCustomEditor(Date.class, "testDate", new CustomDateEditor(dateFormat, true)); } }

@Date public Class testModel { @JsonDeserialize(using = CustomJsonDateDeserializer.class) private testDate; }
public class CustomJsonDateDeserializer extends JsonDeserializer { @Override public Date deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String date = jsonParser.getText(); try { return format.parse(date); } catch (ParseException e) { throw new RuntimeException(e); } } }

위와 같은 설정을 해줘야지 정상적으로 type에 맞게 작업이 가능하다.

Unix Time stamp 변환 Deserialize

kotlin version

class UnixTimestampDeserializer : JsonDeserializer() { @Throws(IOException::class) override fun deserialize(jsonParser: JsonParser, deserializationContext: DeserializationContext): LocalDateTime { val timestamp: Long = jsonParser.longValue return LocalDateTime.ofInstant( Instant.ofEpochMilli(timestamp), TimeZone.getDefault().toZoneId() ) } }
data class Model ( ... @JsonDeserialize(using = UnixTimestampDeserializer::class) var createdAt: LocalDateTime, ... )

This article is licensed under CC BY 4.0 by the author.