Back-end/Java
[JAVA] JavaTimeModule 포멧팅
mashko
2021. 11. 12. 18:07
반응형
https://fe-churi.tistory.com/51
기존 포스팅글에서 이넘에 대한 삽질을 했고 날짜 형식에서 문제가 생겨 JavaTimeModule을 추가했었다.
이어서 추가적으로 타임 포멧팅을 해줄 필요가 생겼다. 패턴을 "yyyy-MM-dd HH:mm:ss"패턴으로 리스폰스시에 변경해줄 필요가 생긴것이다.
방법은 간단하다.
JavaTimeModule javaTimeModule = new JavaTimeModule();
LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Seoul")));
javaTimeModule.addSerializer(LocalDateTime.class, localDateTimeSerializer);
objectMapper.registerModules(javaTimeModule);
JavaTimeModule와 LocalDateTimeSerializer 내부를 들여다 보니 포멧팅을 할 수 있었다.
그래서 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Seoul")를 넘겨주고
모듈에 등록해보니

변환되어 나오는 것이다.
변경한 로직 결과
@Configuration
public class JacksonConfiguration {
@Bean
@Primary
public ObjectMapper enumTypeSerializing() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
JavaTimeModule javaTimeModule = new JavaTimeModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<BaseEnum> modifyEnumDeserializer(DeserializationConfig config,
final JavaType type,
BeanDescription beanDesc,
final JsonDeserializer<?> deserializer) {
return new JsonDeserializer<BaseEnum>() {
@Override
public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
Class<? extends BaseEnum> rawClass = (Class<? extends BaseEnum>) type.getRawClass();
return BaseEnum.getEnum(rawClass, jp.getValueAsString());
}
};
}
});
module.addSerializer(BaseEnum.class, new StdSerializer<BaseEnum>(BaseEnum.class) {
@Override
public void serialize(BaseEnum value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartObject();
jgen.writeStringField("code", String.valueOf(value.getCode()));
jgen.writeStringField("name", value.getName());
jgen.writeStringField("desc", value.getDesc());
jgen.writeEndObject();
}
});
LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Seoul")));
javaTimeModule.addSerializer(LocalDateTime.class, localDateTimeSerializer);
objectMapper.registerModules(javaTimeModule, module);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
}
변경 후에
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")을 일일히 붙여둔 로직들을 전부 제거.
나중에 포멧팅형식이 따로 필요한 애들은 따로 포멧어노테이션을 써서 확인해본결과

updatedAt만 @JsonFormat(pattern = "yyyy-MM-dd")로 변경해보았다.
반응형