Как на Groovy пишется аналог своей Spring-аннотации?

Есть код на Java:
import org.springframework.stereotype.Component;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface TypeConverter {
}

Как его переписать на Groovy? При переносе "в лоб", получаю ошибку "Annotation @org.springframework.stereotype.Component is not allowed on element ANNOTATION"
  • Вопрос задан
  • 449 просмотров
Решения вопроса 2
angry_cellophane
@angry_cellophane
Короче, все сложно.

Глава 1. Что там у джавы?

Смотрим сорцы Component:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any
	 */
	String value() default "";

}


Нам интересен @Target(ElementType.TYPE), чтобы узнать, что он значит, заглянем в JLS 8 #9.6.4.1

Type declarations: class, interface, enum, and annotation type declarations (§8.1.1, §9.1.1, §8.5, §9.5, §8.9, §9.6)

Corresponds to java.lang.annotation.ElementType.TYPE

Additionally, annotation type declarations correspond to java.lang.annotation.ElementType.ANNOTATION_TYPE

В добавок, в джава доках сказано:

public static final ElementType TYPE
Class, interface (including annotation type), or enum declaration


Значит, использовать Component на аннотации можно, а вот groovyc считает по-другому.

Глава 2. Другой груви.

Почему груви компилятор считаем по-другому? Поищем ответ на этот вопрос.
В груви доках ничего похожего я не нашел, поэтому решил посмотреть в тоскливый ишью трекер груви проекта - https://issues.apache.org/jira/browse/GROOVY.
Искал я долго и упорно какое-нибудь похожее ишью и нашел - GROOVY-7151.
Кому лень идти по ссылке и читать рассказываю: проблема есть, пофикшена в компиляторе версии 2.5.0-beta-1.
Последняя релизная версия - 2.4.6.

Глава 3. Что делать?

1. Терпеть и ждать груви 2.5
2. Не использовать груви
3. Не использовать Component на аннотациях.
Ответ написан
Borz
@Borz Автор вопроса
заработало в таком виде:
import groovy.transform.AnnotationCollector
import org.springframework.stereotype.Component

@AnnotationCollector([Component])
@interface TypeConverter {
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы