반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Javascript
- enum
- Docker Desktop 쓰고싶다
- docker desktop 대체
- TypeScript
- 타입스크립트
- mock stub
- frontend
- @Transaction propagation
- Vue+Typescript
- mock stub spy
- HTTP란
- nuxtjs/composition-api buildModules
- Spock Mock Stub Spy
- Mock vs Stub
- 자바스크립트
- Spock Stub
- Spock Spy
- 공짜로 Docker Desktop같은거 쓰기
- Rancher Desktop설치
- @Transaction isolation
- DI
- docker desktop 유료화 정책
- webpack
- Spock Mock
- ECMAScript
- 트랜잭션 격리
- 의존성주입
- TCP/IP
- vue store
Archives
- Today
- Total
끄적끄적
[JAVA] JavaTimeModule 포멧팅 본문
반응형
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")로 변경해보았다.
반응형
'Back-end > Java' 카테고리의 다른 글
[JUNIT] Intellij Junit Test 실패 No tests found for given includes 에러 해결방법 (0) | 2021.11.29 |
---|---|
[SPRING + JPA] QueryDsl FetchJoin (0) | 2021.11.16 |
[JAVA] Enum 삽질기.. (1) | 2021.11.11 |
[JAVA] Spring Boot json Enum json object or jsonvalue (0) | 2021.11.10 |
[JAVA] JVM 동작원리 (0) | 2021.05.10 |
Comments