From 3af79e661928ff066db445f36c7b1968bca51d2a Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Sun, 13 Mar 2022 22:07:57 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20BeanSerializerModifier=20=EB=A5=BC?= =?UTF-8?q?=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EC=A7=81=EB=A0=AC=ED=99=94=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=A9=EB=B2=95=20=EC=98=88=EC=A0=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../playground/jackson/jsonserialize/CarSerializers.kt | 31 +++++++++++++++++++ .../jackson/jsonserialize/CarSerializersTest.kt | 20 +++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/놀이터(예제 코드 작성)/jackson/src/main/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializers.kt b/놀이터(예제 코드 작성)/jackson/src/main/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializers.kt index 12302e5..32f3d4a 100644 --- a/놀이터(예제 코드 작성)/jackson/src/main/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializers.kt +++ b/놀이터(예제 코드 작성)/jackson/src/main/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializers.kt @@ -3,10 +3,15 @@ package com.banjjoknim.playground.jackson.jsonserialize import com.banjjoknim.playground.jackson.common.Car import com.banjjoknim.playground.jackson.common.Secret import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.BeanDescription +import com.fasterxml.jackson.databind.SerializationConfig import com.fasterxml.jackson.databind.SerializerProvider import com.fasterxml.jackson.databind.introspect.Annotated import com.fasterxml.jackson.databind.introspect.AnnotatedMember import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.databind.ser.BeanPropertyWriter +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier import com.fasterxml.jackson.databind.ser.std.StdSerializer /** @@ -125,3 +130,29 @@ class SecretAnnotationSerializer(private val substituteValue: String) : StdSeria gen.writeString(substituteValue) } } + +/** + * 직렬화될 프로퍼티를 수정하도록 하는 방법이다. + * + * BeanSerializerModifier#changeProperties() 를 재정의한 뒤, + * + * SimpleModule 을 이용해서 ObjectMapper 에 등록한다. + * + * 아래처럼 하면 직렬화 대상에서 완전히 제외된다(`@JsonIgnore`와 동일한 효과). + * + * @see com.fasterxml.jackson.databind.ser.BeanSerializerModifier + * @see com.fasterxml.jackson.databind.module.SimpleModule + */ +class SecretBeanSerializerModifier : BeanSerializerModifier() { + override fun changeProperties( + config: SerializationConfig, + beanDesc: BeanDescription, + beanProperties: MutableList + ): MutableList { + SimpleModule() + return beanProperties + .filter { property -> property.getAnnotation(Secret::class.java) == null } + .toMutableList() +// return super.changeProperties(config, beanDesc, beanProperties) + } +} diff --git a/놀이터(예제 코드 작성)/jackson/src/test/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializersTest.kt b/놀이터(예제 코드 작성)/jackson/src/test/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializersTest.kt index f516962..89ca3fc 100644 --- a/놀이터(예제 코드 작성)/jackson/src/test/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializersTest.kt +++ b/놀이터(예제 코드 작성)/jackson/src/test/kotlin/com/banjjoknim/playground/jackson/jsonserialize/CarSerializersTest.kt @@ -148,7 +148,7 @@ class CarSerializersTest { } @Test - fun `@Secret 어노테이션을 적용하여 직렬화한다`() { + fun `@Secret 어노테이션, AnnotationIntrospector 을 적용하여 직렬화한다`() { // given mapper.setAnnotationIntrospector(SecretAnnotationIntrospector()) @@ -159,6 +159,24 @@ class CarSerializersTest { assertThat(actual).isEqualTo("""{"name":"banjjoknim","secret":"****","price":10000000,"owner":{"name":"ban","age":30}}""") } + @Test + fun `@Secret 어노테이션, BeanSerializerModifier 를 적용하여 직렬화한다`() { + // given + val module = object : SimpleModule() { + override fun setupModule(context: SetupContext) { + super.setupModule(context) + context.addBeanSerializerModifier(SecretBeanSerializerModifier()) + } + } + mapper.registerModule(module) + + // when + val actual = mapper.writeValueAsString(carUsingSecretAnnotation) + + // then + assertThat(actual).isEqualTo("""{"name":"banjjoknim","price":10000000,"owner":{"name":"ban","age":30}}""") + } + /** * * Kotlin + Spring Boot 를 사용한다면 `com.fasterxml.jackson.module:jackson-module-kotlin` 의존성을 사용할 것이다.