2016-12-29 8 views
0

Есть ли способ реализовать аннотацию, чтобы самостоятельно изменить значение параметра?Изменение значения параметра пользовательской аннотации

Например:

Я хотел бы создать пользовательские RequestMapping аннотацию, чтобы избавиться от некоторых кодовых дубликатов.

Текущий код:

@RequestMapping("/this/is/duplicate/few/times/some") 
public class SomeController { 
} 

И я хочу, чтобы создать что-то вроде этого

@Retention(RetentionPolicy.RUNTIME) 
@RequestMapping() 
public @interface CustomRequestMapping { 

    String value() default ""; 

    @AliasFor(annotation = RequestMapping.class, attribute = "value") 
    String "/this/is/duplicate/few/times"+value(); 

} 

Для того, чтобы уменьшить значение Mapping Запрос на это:

@CustomRequestMapping("/some") 
public class SomeController { 
} 

К сожалению, я не могу найти способ сделать это компилируемым. Или, может быть, есть способ использовать аннотацию AliasFor для передачи параметра в целевой массив. Что-то вроде этого:

@Retention(RetentionPolicy.RUNTIME) 
    @RequestMapping() 
    public @interface CustomRequestMapping { 

    @AliasFor(annotation = RequestMapping.class, attribute = "value{1}") 
    String value() default ""; 

    @AliasFor(annotation = RequestMapping.class, attribute = "value{0}") 
    String prefixPath() default "/this/is/duplicate/few/times"; 

} 

ответ

2

Что, кажется, это вы пытаетесь сделать подтип аннотации и изменить один из его атрибутов значения по умолчанию

подтип аннотаций не представляется возможный и here является JSR констатирует причина.

It complicates the annotation type system,and makes it much more difficult 
to write “Specific Tools”. 

“Specific Tools” — Programs that query known annotation types of arbitrary 
external programs. Stub generators, for example, fall into this category. 
These programs will read annotated classes without loading them into the 
virtual machine, but will load annotation interfaces. 
+0

Да. Я прочитал этот документ, когда искал решение. Мне было интересно, есть ли какой-нибудь хак, который заполнит мое требование – graczun

0

Одним из решений проблемы с дублированием может быть извлечение константы.

@Annotation(MyClass.FOO+"localValue") 
public class MyClass 
{ 
    public static final String FOO = "foo"; 
    ... 
} 
+0

, что я не имел в виду. Я искал решение передать только аннотацию «localValue». В этом случае мне нужно будет добавить MyClass.FOO самостоятельно. Я хочу, чтобы это было автоматически. – graczun