복붙노트

[SPRING] serialize 메서드를 재정의하지 않고 특정 클래스에 대해 JsonSerializer의 isEmpty 메서드를 재정의하는 방법?

SPRING

serialize 메서드를 재정의하지 않고 특정 클래스에 대해 JsonSerializer의 isEmpty 메서드를 재정의하는 방법?

isEmpty 메서드에 대한 사용자 지정 동작을 추가하고 싶습니다.

내가 JsonSerializer

추상화하기 때문에 serialize 메서드를 재정의해야합니다.

나는 메서드를 serialize하고 그냥 isEmpty 메서드를 재정의하고 싶습니다.

해결법

  1. ==============================

    1.isEmpty 동작을 수정하지만 기본 직렬화를 유지하려면 serializer 수정자를 이용할 수 있습니다. 여전히 사용자 정의 serializer를 구현해야하지만 기본 serialization은 매우 깨끗하게 사용할 수 있습니다.

    isEmpty 동작을 수정하지만 기본 직렬화를 유지하려면 serializer 수정자를 이용할 수 있습니다. 여전히 사용자 정의 serializer를 구현해야하지만 기본 serialization은 매우 깨끗하게 사용할 수 있습니다.

    커스텀 serializer 클래스에 defaultSerializer 변수를 삽입하십시오. 수정자를 구현할 때이 직렬 자의 출처를 볼 수 있습니다. 이 클래스에서는 isEmpty 메서드를 재정 의하여 필요한 것을 수행합니다. 아래에서 MySpecificClass에 null ID가 있으면 Jackson에 의해 비어있는 것으로 간주됩니다.

    public class MySpecificClassSerializer extends JsonSerializer<MySpecificClass> {
        private final JsonSerializer<Object> defaultSerializer;
    
        public MySpecificClassSerializer(JsonSerializer<Object> defaultSerializer) {
            this.defaultSerializer = checkNotNull(defaultSerializer);
        }
    
        @Override
        public void serialize(MySpecificClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            defaultSerializer.serialize(value, gen, serializers);
        }
    
        @Override
        public boolean isEmpty(SerializerProvider provider, MySpecificClass value) {
            return value.id == null;
        }
    }
    

    BeanSerializerModifier를 확장 해, modifySerializer 메소드를 오버라이드 (override)합니다. 이 메소드의 내부에서 조작하려는 클래스 유형을 필터링하고 이에 따라 사용자 정의 직렬 변환기를 리턴 할 수 있습니다.

    public class MyClassSerializerModifier extends BeanSerializerModifier {
        @Override
        public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
            if (beanDesc.getBeanClass() == MySpecificClass.class) {
                return new MySpecificClassSerializer((JsonSerializer<Object>) serializer);
            }
            return serializer;
        }
    }
    

    수정자를 등록하면 modifySerializer의 조건이 충족 될 때마다 serializer가 트리거 될 수 있습니다.

    ObjectMapper om = new ObjectMapper()
            .registerModule(new SimpleModule()
                    .setSerializerModifier(new MyClassSerializerModifier()));
    
  2. ==============================

    2.결국에는 serialize 메소드에 대한 구현이 추상이어야하므로 결국 구현해야합니다. 적어도 하나의 메소드가 추상적으로 남아 있다면 클래스를 인스턴스화 할 수 없습니다.

    결국에는 serialize 메소드에 대한 구현이 추상이어야하므로 결국 구현해야합니다. 적어도 하나의 메소드가 추상적으로 남아 있다면 클래스를 인스턴스화 할 수 없습니다.

  3. from https://stackoverflow.com/questions/31025046/how-to-override-isempty-method-of-jsonserializer-for-specific-class-without-over by cc-by-sa and MIT license