Не удается найти EJB beanName при развертывании - PullRequest
1 голос
/ 08 января 2012

Привет, @Все :) У меня тут странная проблема. Я хочу внедрить управляемую сущность UserBean в класс с @EJB(beanName="user"). Если я не использую атрибут beanName, я получаю следующее сообщение об ошибке:

 org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name null  

Если я использую это так, @EJB(beanName="user") UserBean user; Я получаю это:

 org.jboss.as.server.deployment.DeploymentUnitProcessingException: No component found for type 'defaultPackage.UserBean' with name user  

Что я делаю не так?

Вот этот UserBean и как я его впрыскиваю:

UserBean

// removed imports
@ManagedBean(name="user")
@Local
@SessionScoped
@Entity
@Table(name="t_user")
public class UserBean implements Serializable, UserInterface{
    // fields (@Columns, etc.)
    // setters / getters
}

UserBeanUser

// more removed imports
@ManagedBean(name="userUsed")
@Stateful
@Local
public class UserOfUserBean implements Serializable, Userable {

    private @EJB(beanName="user") UserBean user;
}

Интерфейсы пусты и помечены как @Local.

1 Ответ

3 голосов
/ 08 января 2012

Извините, но на многих уровнях это неправильно, так что трудно начать.

Для начала аннотация @Local бесполезна в коде, который вы показываете. Он используется для обозначения интерфейса как бизнес-интерфейса для EJB или для указания на такой интерфейс.

Тогда сущность UserBean, вероятно, не должна быть областью видимости и управляемым компонентом. Эти аннотации предназначены для того, чтобы позволить бобовому контейнеру управлять жизненным стилем бина, но в случае сущности за это отвечает менеджер сущностей.

Неясно, использовали ли вы здесь аннотацию JSF или Java EE ManagedBean, но последняя никогда не нужна, а первая не должна быть в соответствии с приведенным выше объяснением.

Кроме того, в соответствии с типичными соглашениями рассмотрите возможность именования сущности просто User и не позволяйте ей реализовывать интерфейс.

UserOfUserBean еще сложнее расшифровать. Предполагается, что этот bean-компонент является бизнес-службой или вспомогательным компонентом (JSF)? Если это бэк-бин, вам не нужна аннотация @Stateful, в противном случае вам не нужна @ManagedBean.

Тогда главный виновник вашего вопроса: аннотация @EJB не может внедрять бины не-EJB. Объекты JPA (@Entity) и управляемые компоненты JSF (@javax.faces.bean.ManagedBean) не являются компонентами EJB.

Кроме того, атрибут beanName @EJB не соответствует атрибуту name в @ManagedBean. Имя bean-компонента - это внутренняя вещь EJB, используемая для устранения неоднозначности внедрения, если интерфейс реализован несколькими bean-компонентами и не имеет отношения ни к имени управляемого bean-компонента JSF, ни к имени управляемого bean-компонента Java EE. (неприменимо к вашему вопросу, но существует связь между @Named CDI и именем управляемого компонента JSF)

Наконец, сущностям и вспомогательным компонентам не нужны пустые интерфейсы, помеченные как @Local.

Итак, ваша сущность должна стать примерно такой:

@Entity
@Table(name="t_user")
public class User implements Serializable {
    // fields (@Columns, etc.)
    // setters / getters
}

И вы должны забыть о введении сущности, как вы это сделали. Если вы хотите сделать его доступным в сеансе HTTP, поместите его туда вручную (например, после входа в систему). См. Этот ответ для более подробного объяснения того, как это сделать: https://stackoverflow.com/a/6355064/472792

Предполагая, что ваш UserOfUserBean был бэк-бином, он стал бы примерно таким с CDI:

@Named(name="userUsed")
public class UserOfUserBean {

    @Inject
    @LoggedIn // see answer from jan groth
    private User user;
}

или только с аннотациями JSF:

@ManagedBean(name="userUsed") // from javax.faces.bean, not javax.annotation
public class UserOfUserBean {

    @ManagedProperty("#{user}") 
    private User user;

    // Mandatory setter for JSF-native injection
    public void setUser(User user) {
        this.user = user;
    }
}

Некоторые дополнительные ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...