Расширение бина @Named @SessionScoped - PullRequest
1 голос
/ 23 ноября 2011

У меня есть родительский класс с именем Navigation и дочерний класс с именем ExtendingNavigation. Navigation аннотируется как @Named("navigation") и @SessionScoped (javax.enterprise.context.SessionScoped;). В нем я вставляю UserBean и инициализирую его методом login(). Допустим, я хочу использовать userBean в других классах. Как мне это сделать? И почему я не могу расширить от Navigation?

Вот классы (только для примера):

Навигация

@Named("navigation")
@SessionScoped
public class Navigation implements Serializable {
    private static final long serialVersionUID = 1L;

    @Inject
    protected UserBean userBean;

        public void logout() {
        userBean = null;
    }

    public void login() {       
        EntityManager em = JPAUtil.getEntityManagerFactory().createEntityManager();
        userBean = em.find(UserBean.class, userBean.getUsername());
    }
}

ExtendingNavigation

public class ExtendingNavigation extends Navigation{


}

Если я пытаюсь скомпилировать это, это выдает мне ошибку.

17:01:29,956 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC00001: Failed to start service jboss.deployment.unit."timereport.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."timereport.war".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]]
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:96)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) [:1.6.0_07]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) [:1.6.0_07]
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_07]
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:274)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:106)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:129)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:351)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:336)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:404)
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82)
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:89)
    ... 5 more

Помогите пожалуйста!

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Проблема не в внедрении UserBean, вы можете использовать его в других местах.

Проблема в том, что ваш подкласс ExtendingNavigation имеет тот же классификатор, что и ваш Navigation класс(название «навигация»).Аннотируйте ExtendingNavigation с помощью @Named("extendedNavigation") или что-то в этом роде, а затем укажите @Named("extendedNavigation") рядом с @Inject, где вы хотите его использовать.

Подумайте об этом так: вы говорите: «Дайте мнеэкземпляр класса X ", и Weld говорит:" Я не знаю, какой вы хотите ", потому что на самом деле есть два класса, которые являются навигацией.

class ValidateUserAuthenticationAction {
    @Inject
    @Named("extendedNavigation")
    private Navigation navigation;
}

Кроме того, попробуйте использовать интерфейсы!Навигация должна быть интерфейсом.BasicNavigation должен реализовать его, и ExtendedNavigation также должен его реализовать.

1 голос
/ 25 ноября 2011

Ваша проблема в том, что вы внедряете экземпляр Navigation в свой класс ValidateUserAuthenticationAction, однако, у вас есть два разных класса, которые можно использовать в этой точке инъекции, так же как состояния основного исключения.Самый простой способ решить эту проблему - добавить квалификатор к точке внедрения (если вы выберете) и к одному из двух Navigation классов.

Квалификаторы - это решение этой проблемы, и весь их смыслбыть в спецификации.Квалификатор добавляет дополнительную неоднозначность для точки инъекции, или, другими словами, он помогает специализировать класс и точку инъекции.

0 голосов
/ 19 марта 2013

У меня была очень похожая проблема, и я получил некоторую автономную помощь.Моя проблема заключалась в том, что там, где был мой сервис, он был включен в развернутое ухо И в мой веб-проект.Это было случайное дублирование, удалите его, и оно будет работать, если это также ваш случай.

здесь на следующем рисунке у меня есть esb_khr внутри esb_khr_web, я удалил.В затмении: перейти к свойствам и сборке развертывания.

enter image description here

...