Как создать аннотацию, представляющую собой группу аннотаций?
Примерно через год я прочитал статью, в которой объяснялось, как я могу создать аннотацию, которая в основном представляет собой контейнер для других аннотаций. Таким образом, если я всегда использую те же 5 аннотаций в конкретном случае использования, я создаю аннотацию, содержащую их, и использую это вместо этого.
К сожалению, я больше не могу найти статью и хотел бы сделать это прямо сейчас для моей настройки Jackson.
Поскольку я не могу найти какую-либо информацию по этому поводу, я начинаю сомневаться в своей памяти. Возможно ли это, или я просто ошибаюсь?
ИЗМЕНИТЬ
Я хочу что-то вроде:
@Target(ElementType.METHOD)
@com.fasterxml.jackson.databind.annotation.JsonSerialize(using=MySerializerThatIsUsedEverywhere.class
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(MyCustomXmlAdapter.class)
@SomeOtherEvaluatedByTheSerializer
public @interface SerializerUseCase01 {
public String a();
public int b();
)
Мой сценарий заключается в том, что у меня есть куча сериализации, которые могут обрабатываться одним и тем же сериализатором с различными конфигурациями. Чтобы сделать все проще в использовании и более прозрачным, я хочу обернуть конфигурацию jackson и конфигурацию serializer в одну аннотацию.
Ответы
Ответ 1
Для Джексона это можно сделать с помощью мета-аннотации @JacksonAnnotationsInside
. Подробнее см. в этой статье, но фрагмент кода:
@Retention(RetentionPolicy.RUNTIME) // IMPORTANT
@JacksonAnnotationsInside
@JsonInclude(Include.NON_NULL)
@JsonPropertyOrder({ "id", "name" })
public @interface MyStdAnnotations
и оттуда вы можете использовать этот тип для своих собственных классов:
@MyStdAnnotations
public class MyBean {
public String name, id;
}
Ответ 2
Ниже приведены примеры о том, как создавать различные комбинации аннотаций, содержащих другие аннотации. Это то, что вы ищете?
Пример из источника:
@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
public String a();
public int b();
)
@Target(ElementType.METHOD)
public @interface ReallyComplexAnnotation {
public SimpleAnnotation[] value();
)
Используется следующим образом:
@ReallyComplexAnnotation(
{ @SimpleAnnotation(a="...", b=3), @SimpleAnnotation(a="...", b=4) }
)