2015-08-17 5 views
4

С Spring 3.1 и профилями становится интересным создание настраиваемого интерфейса для определения конкретных профилей. Часть красоты - это способность полностью забыть имя строки профиля и просто использовать аннотацию.Как получить имя профиля Spring из аннотации?

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Profile("Dev") 
public @interface Dev { 

} 

А затем просто аннотация бобы с @Dev. Это отлично работает.

Однако, как я могу проверить, активен ли профиль @Dev? Environment.acceptsProfiles() требует аргумент String. Есть ли «аккуратный» способ сделать это, или это мой единственный вариант, чтобы сделать что-то вроде:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Profile(Dev.NAME) 
public @interface Dev { 
    public static String NAME = "Dev"; 
} 


public class MyClass{ 

    @Autowired 
    private Environment env; 

    private void myMethod(){ 
     if(env.acceptsProfiles(Dev.NAME)) 
      // do something here 
     ; 
    } 

Хотя функциональный, я не особенно люблю эту концепцию. Есть ли другой способ сделать это более аккуратным?

+0

Почему вы пытаетесь явно проверить? – chrylis

+0

@chrylis Поскольку мне нужно включить определенные вещи в моем интерфейсе на основе выбора профиля, так что хотите передать логический флаг на передний конец jsps –

+0

Хмм. Поскольку вы пытаетесь абстрагировать имя профиля в первую очередь, я думаю, вам придется либо проследить путь мета-аннотации, либо, возможно, зарегистрировать компонент в профиле. – chrylis

ответ

3

Я хотел сделать что-то подобное (в моем случае, представляет собой список синонимов под одной аннотацией профиля), но я столкнулся с проблемой, связанной с вами, а также с другим ограничением: вы не сможете применить больше, чем одну из аннотаций к одному фасоли и попросите их обоих получить spring (по крайней мере, в spring 3).

К сожалению, поскольку вы не можете передать enum in, решение, на котором я остановился, состояло в том, чтобы просто использовать простые текстовые константы без перечисления. Тогда я мог бы сделать что-то вроде @Profile(CONSTANT_ONE, CONSTANT_TWO). Я по-прежнему получал выгоду от неспособности сделать опечатки, но также получил возможность по-прежнему применять несколько профилей к одному и тому же компоненту.

Не идеальный, но не очень плохой.

+0

Спасибо - я искал что-то более элегантное и понял, что должно быть что-то еще доступное. –