2016-02-05 15 views
7

Trong mã của tôi, tôi sẽ có rất nhiều thu khí như thế này với cùng một tập các chú thích (một cho Hibernate và những người khác cho Jackson):Kết hợp nhiều chú thích tùy ý trong một

@Transient 
@JsonSerialize(using = LocalDateTimeSerializer.class) 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = BaseEntity.JSON_DATETIME_FORMAT) 
public LocalDateTime getCreatedDateDT() { 
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT); 
} 

Tôi muốn giảm thiểu sự lặp lại bằng cách thực hiện chú thích của riêng tôi, điều này sẽ có nghĩa là tất cả bốn chú giải này cùng nhau, như sau:

@TransientLocalDateTime 
public LocalDateTime getCreatedDateDT() { 
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT); 
} 

Làm cách nào để thực hiện? Điều này thậm chí có thể?

CẬP NHẬT Nhờ Konstantin Yovkov, bây giờ tôi biết, tôi có thể kết hợp tất cả các chú thích Jackson trong một, nhưng đó là bởi vì vi xử lý chú thích của Jackson nhận một thủ thuật như vậy. Tôi tự hỏi liệu có thể làm cho bất kỳ bộ xử lý chú thích nào làm điều đó không? Dường như với tôi rằng nó không phải.

Trả lời

6

Jackson cung cấp một meta-chú thích (chú thích dùng để chú thích một chú thích), được gọi là @JacksonAnnotationsInside, mà là một:

Meta-chú thích (chú thích được sử dụng trên các chú thích khác) sử dụng cho chỉ ra rằng thay vì sử dụng chú thích đích (chú thích được chú thích với chú thích này), Jackson nên sử dụng chú thích meta . Điều này có thể hữu ích trong việc tạo ra "chú thích kết hợp" bằng cách có chú thích vùng chứa , cần chú thích chú thích này với chú thích cũng như tất cả chú thích nó có chứa '.'

Vì vậy, bạn nên tạo một chú thích như thế này:

@Target(value = { ElementType.TYPE, ElementType.METHOD, 
        ElementType.PARAMETER, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@JacksonAnnotationsInside // <-- this one is mandatory 
@Transient 
@JsonSerialize(using = LocalDateTimeSerializer.class) 
@JsonDeserialize(using = LocalDateTimeDeserializer.class) 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = BaseEntity.JSON_DATETIME_FORMAT) 
public @interface TransientLocalDateTime {  
} 

và sử dụng giống như:

@TransientLocalDateTime 
public LocalDateTime getCreatedDateDT() { 
    return DateTimeUtils.klabTimestampToLocalDateTime(getCreatedDate(), createdDateDT); 
} 
+0

này là hữu ích, nhưng nó có thể được sử dụng cho các chú thích tùy ý hoặc cho Jackson chỉ chú thích? Có vẻ như '@ Transient' không được phép ở đây. –

+1

Tôi có thể được sử dụng cho chú thích tùy ý, nhưng chỉ có thể được xử lý bởi bộ xử lý chú thích Jackson ... trừ khi bạn viết bộ xử lý chú thích tùy chỉnh, nhưng sau đó tôi tin rằng bạn chỉ có thể giới thiệu chú thích mới (và không sử dụng '@JacksonAnnotationsInside'), được xử lý bởi bộ xử lý chú thích của bạn. –

+0

Ngoài ra, tôi nhận được lỗi '@TransientLocalDateTime không áp dụng cho phương thức' trong IDE của tôi. –

Các vấn đề liên quan