feat : BeanSerializerModifier 를 이용한 직렬화 설정 방법 예제 추가

This commit is contained in:
banjjoknim
2022-03-13 22:07:57 +09:00
parent 2e63b9b128
commit 3af79e6619
2 changed files with 50 additions and 1 deletions

View File

@@ -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<BeanPropertyWriter>
): MutableList<BeanPropertyWriter> {
SimpleModule()
return beanProperties
.filter { property -> property.getAnnotation(Secret::class.java) == null }
.toMutableList()
// return super.changeProperties(config, beanDesc, beanProperties)
}
}

View File

@@ -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` 의존성을 사용할 것이다.