2015-11-06 5 views
0

Я пишу свою небольшую структуру MVC, и я пытаюсь интегрировать CDI. Концепция похожа на Spring MVC, есть аннотации ServletDispatcher и @Controller.Настройка CDI во внешней библиотеке

Классы, сопоставленные с @Controller, должны управляться бобами.

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@IndexAnnotated 
@RequestScoped 
public @interface Controller { 
    String value() default ""; 
} 

Затем я хочу, чтобы получить класс контроллера в моей библиотеке из контекста приложения, как этот

Object controller = CDI.current().select(controllerClass).get(); 

Но я получаю

java.lang.ClassNotFoundException: javax.enterprise.inject.spi.CDI 

Я добавил зависимость в pom.xml в моя библиотека

<dependency> 
     <groupId>javax.enterprise</groupId> 
     <artifactId>cdi-api</artifactId> 
     <version>1.2</version> 
</dependency> 

Это также присутствует в моем проекте, который использует эту библиотеку. Уже пытался изменить область действия, но не повезло.

bean.xml присутствует и в моей библиотеке и проекта на основной/веб-приложение/WEB-INF/bean.xml

Что мне не хватает? Возможно ли иметь библиотеку, которая извлекает компоненты из контекста приложения, использующего эту библиотеку?

Мой сервер приложений TomEE

+1

Сервлеты могут вводить CDI-компоненты. Поэтому, если у вас есть диспетчерский сервлет, просто введите «BeanManager» и используйте это, чтобы получить контекстный экземпляр вашего класса контроллера. Это должно работать с API CDI 1.0. –

ответ

1

TomEE поддерживает Java EE 6/1,0 CDI.

javax.enterprise.inject.spi.CDI был представлен в Java EE 7/CDI 1.1.

Вы не можете просто обновить спецификации API, когда контейнер основан на более старой версии.

0

Благодарим за отзыв, что TomEE поддерживает только Java EE6. Решение

public class CdiUtils { 
    private static BeanManager beanManager; 

    @SuppressWarnings("unchecked") 
    public static <T> T getBean(Class<T> beanClass) throws NamingException { 
     Bean<T> bean = (Bean<T>) getBeanManager().getBeans(beanClass).iterator().next(); 
     CreationalContext<T> ctx = getBeanManager().createCreationalContext(bean); 
     return (T) getBeanManager().getReference(bean, beanClass, ctx); 
    } 

    private static BeanManager getBeanManager() throws NamingException { 
     if (beanManager == null) { 
      InitialContext context = new InitialContext(); 
      beanManager = (BeanManager) context.lookup("java:comp/BeanManager"); 
     } 
     return beanManager; 
    } 
} 
Смежные вопросы