Подтвердить что ты не робот

CDI Неоднозначные зависимости

У меня есть @SessionScoped @Named bean с @Producer для объекта пользователя:

@Named @SessionScoped
public class UserBean implements Serializable
{
  //...
  @Named @Produces @LoggedIn @SessionScoped
  public MyUser getCurrentUser() {return user;}
}

Это отлично работает в моей настройке (JBoss-7.1.1-Final), и нет проблем с доступом к полям пользователя с JSF-страниц с помощью #{currentUser.name}. Квалификатор org.jboss.seam.security.annotations.LoggedIn. Теперь я хочу @Inject этого пользователя в поле в другом @Named Bean:

@Named
public class FavBean implements Serializable
{   
  private @Inject @LoggedIn MyUser currentUser;
}

Это дает мне ошибку:

org.jboss.weld.exceptions.DeploymentException:
WELD-001409 Ambiguous dependencies for type [MyUser] with qualifiers [@Default] at
  injection point [[field] @Inject @LoggedIn test.FavBean.currentUser].
Possible dependencies [[Managed Bean [class test.ejb.MyUser] with qualifiers
  [@Any @Default],
Producer Method [MyUser] with qualifiers [@Any @Default] declared as [[method]
  @Named @Produces @LoggedIn @SessionScoped public test.UserBean.getCurrentUser()]]]

Я не понимаю первую зависимость Managed Bean [class test.ejb.MyUser] Этот класс является простым @Entity и развернут в ebb.jar в EAR. В качестве обходного пути я в настоящее время вводя UserBean, получаю от пользователя.

4b9b3361

Ответ 1

Это связано с тем, что CDI ищет beans по типу, а ваш объект и метод производителя возвращают один и тот же тип. Вот почему это неоднозначно.

Вам нужно определить новый классификатор и аннотировать его с помощью метода производителя.

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface CurrentUser {
}

Добавьте эту аннотацию к вашему методу продюсера:

@Named @Produces @CurrentUser @LoggedIn @SessionScoped
public MyUser getCurrentUser() {return user;}

Ответ 2

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

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

enter image description here

Ответ 3

Я не эксперт, но у меня была аналогичная проблема, и я исправил ее проще, аннотируя сам bean с помощью @Alternative, чтобы Producer был одобрен. Может быть, я пропускаю некоторые побочные эффекты, но это работало, насколько я мог видеть/нуждался.