>

주석을 달 때 항상 주어진 속성을 토큰 화하기 위해 사용자 정의 주석을 만들려고하므로 다음 구조를 갖습니다.

@JsonComponent
public class TokenSerializer {
    @JsonSerialize(using = IdToTokenSerializer.class) // This does not work 
    @JsonDeserialize(using = TokenToIdDeserializer.class) // This does not work 
    @Retention(RetentionPolicy.RUNTIME)
    public static @interface TokenizedId {
        Class<?> value();
    }
    public static class IdToTokenSerializer extends JsonSerializer<Long> implements ContextualSerializer {
        ...
    }
    public static class TokenToIdDeserializer extends JsonDeserializer<Long> implements ContextualDeserializer {
        ...
    }
}

왜 그런 식으로 사용하나요? @TokenizedId  조건을 직렬화 기/디시리얼라이저에서 고려하여 수행 할 클래스를 제공합니다. 이 값은 ContextualDeserializer 를 사용하여 구성됩니다. @TokenizedId 에서 클래스를 가져옵니다. .

문제는 다음과 같이 주석을 달면 직렬 변환기와 직렬 변환기가 작동하지 않는다는 것입니다.

@TokenizedId(MyClass.class)
private Long id;

그러나 그들은 이렇게 사용할 때 작동합니다 ( @JsonSerialize 제거)  그리고 @JsonDeserialize   @TokenizedId 에서 ) :

@JsonSerialize(using = IdToTokenSerializer.class)
@JsonDeserialize(using = TokenToIdDeserializer.class)
@TokenizedId(MyClass.class)
private Long id;

개인적으로 나는이 접근법을 좋아하지 않았다. 왜냐하면 개발자는 ID를 토큰 화 할 때 항상이 세 가지 주석을 사용해야한다는 것을 기억해야하며 또한 @TokenizedId 를 원합니다.  항상 이러한 시리얼 라이저와 관련이 있습니다.

다른 주석에 주석을 달 때 시리얼 라이저/디시리얼라이저를 작동시키는 방법이 있습니까?

  • 답변 # 1

    Jackson 라이브러리에서 힌트를 찾은 후 주석이 원하는 방식으로 작동하도록 만들 수있었습니다.  주석 :

    @JacksonAnnotationsInside
    
    

    내 주석에 이것을 포함하면 문제가 해결되었습니다.

    /**
     * Meta-annotation (annotations used on other annotations)
     * used for indicating that instead of using target annotation
     * (annotation annotated with this annotation),
     * Jackson should use meta-annotations it has.
     * This can be useful in creating "combo-annotations" by having
     * a container annotation, which needs to be annotated with this
     * annotation as well as all annotations it 'contains'.
     * 
     * @since 2.0
     */
    @Target({ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotation
    public @interface JacksonAnnotationsInside
    {
    }
    
    

    @JacksonAnnotationsInside @JsonSerialize(using = IdToTokenSerializer.class) @JsonDeserialize(using = TokenToIdDeserializer.class) @Retention(RetentionPolicy.RUNTIME) public static @interface TokenizedId { Class<?> value(); }

  • 이전 templates - <? = 대신 사용할 수있는 PHP 함수
  • 다음 Copying Data from Multiple Worksheets in Workbooks to Differing Worksheets in Separate Workbook - 통합 문서의 여러 워크 시트에서 별도의 통합 문서의 다