Вопрос по java – CDI Неоднозначные зависимости

13

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

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

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

<code>@Named
public class FavBean implements Serializable
{   
  private @Inject @LoggedIn MyUser currentUser;
}
</code>

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

<code>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()]]]
</code>

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

Ваш Ответ

3   ответа
22

что CDI ищет бины по типу, а ваша сущность и метод продюсера возвращают один и тот же тип. Вот почему это неоднозначно.

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

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

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

@Named @Produces @CurrentUser @LoggedIn @SessionScoped
public MyUser getCurrentUser() {return user;}
Или модифицируйLoggedIn аннотация путем добавленияQualifier к этому. Кажется, это не имеетQualifier. Nikita Beloglazov
2

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

3

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

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

Похожие вопросы