Внедрить сущность в компонент ViewScoped - PullRequest
1 голос
/ 14 июня 2011

Я новичок в CDI и хочу использовать это для приложения JSF2.Класс MyUser представляет собой простой @Entity -Bean-компонент, и объект создается в методе @PostConstruct в bean-компоненте:

@Stateful
@Named @javax.faces.bean.SessionScoped
public class UserBean implements Serializable
{
    @Named
    private MyUser user;

    //setter and getter
    //@PostConstruct
}

Доступ к пользователю на страницах JSF работает так:*.Но теперь я хочу получить доступ к этому объекту из других бинов, например, в этом @ViewScopedBean:

@Named @javax.faces.bean.ViewScoped
public class TestBean implements Serializable
{       
    @Inject private MyUser user;
}

Я хочу, чтобы текущий (вошедший в систему) MyUser user был доступен в нескольких других бинах, ноЯ не уверен, как это сделать.Просто @Inject это не сработало (и я почти уверен, что это будет чуть-чуть к простому ).

13:56:22,371 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController]
Error installing to Start: name=vfs:///Applications/Development/
jboss-6.0.0.Final/server/default/deploy/test.ear_WeldBootstrapBean state=Create:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied
dependencies for type [MyUser] with qualifiers [@Default] at injection
point [[field] @Inject private test.controller.mbean.TestBean.user]

Каков наилучший подход для доступа к user из других бинов?Код стиля JSF1.2, например UserBean bean = (UserBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("UserBean");, кажется старомодным!

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Прежде всего: вы не хотите напрямую вводить объекты.Объекты довольно независимо контролируются ORM-структурой и имеют собственный жизненный цикл.Не используйте их как управляемые бобы.

В соответствии с этим определением сущности JPA являются технически управляемыми компонентами.Тем не менее, сущности имеют свой собственный особый жизненный цикл, модель состояния и модель идентичности и обычно создаются JPA или используют new.Поэтому мы не рекомендуем напрямую вводить класс сущности.Мы особенно не рекомендуем присваивать область, отличную от @Dependent, для класса сущности, поскольку JPA не может сохранять введенные прокси-серверы CDI.

Подробнее см. здесь .

Чтобы ответить на ваш вопрос: вы не можете «выдать» что-то вроде (аутентифицированного) пользователя, даже если это было возможно в Seam 2, весь механизм прокси CDI не позволяет этого больше.Вам необходимо сделать следующее:

  • Написать управляемый компонент, который обрабатывает аутентификацию, и поместить его в правильную область (вероятно, область сеанса).
  • Если вход выполнен успешно, используйте атрибут этого компонента для хранения аутентифицированного пользователя.
  • Используйте метод продюсера (возможно, с квалификатором, подобным @LoggedIn), чтобы сделать пользователя доступным в вашем приложении

Внедрить пользователя следующим образом:

@Inject
@LoggedIn
private User user

Это CDI-путь; -)

0 голосов
/ 14 июня 2011

CDI не указывает аннотацию @ViewScoped.Это аннотация JSF2.Допустимые аннотации: @RequestScoped, @SessionScoped, @ApplicationScoped, @Dependent и @ConversationScoped.Первые три являются единственными областями JSF, разрешенными CDI.

Если вам нужно поддерживать аннотацию @ViewScope, вам нужно написать ее самостоятельно.К счастью, кто-то еще делал это до .

0 голосов
/ 14 июня 2011

Является ли компонент @Inject ed компонентом @Named?

Если это так, имеет ли компонент MyUser меньшую область действия, чем TestBean.Помните, что управляемые свойства бина @ViewScoped должны быть @ViewScoped, @SessionScoped или @ ApplicationScoped

...