2012-01-08 5 views
1

Привет @Все :) У меня здесь странная проблема. Я хочу ввести UserBean управляемый объект в класс с @EJB(beanName="user"). Если я не использую атрибут beanName я получаю следующее сообщение об ошибке:Не удается найти EJB 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.

+0

Теперь, когда я вижу это, я говорю «Вы идиот» к себе в прошлом. – nyxz

ответ

3

Прошу прощения, но это неправильно на стольких уровнях, что трудно начать.

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

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

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

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

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

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

Кроме того, атрибут @EJBbeanName не соответствуют атрибуту name в @ManagedBean. Имя компонента - это внутренняя вещь EJB, используемая для устранения неоднозначности инъекции, если интерфейс реализован несколькими компонентами и не имеет никакого отношения ни к имени управляемого компонента JSF, ни к имени управляемого Java EE.(не применимо к вашему вопросу, но существует связь между управляемым именем боба CDI в @Named и 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 была бэк-боб, он бы тогда что-то вроде этого с КДИ:

@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; 
    } 
} 

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

+0

Очень хорошо, спасибо за ваши звуки и подробный ответ. Еще один вопрос к вам: можете ли вы дать мне несколько ссылок на хорошую книгу, которую я мог бы прочитать о EJB/JSF/CDI, потому что я думаю, что я полностью перепутал все эти вещи. – nyxz

+1

Добро пожаловать. Я нашел следующие книги полезными для чистой теории EJB: http://www.amazon.co.uk/dp/0596158025 и http://www.amazon.co.uk/dp/1933988347 и следующие для JSF: http: //www.amazon.co.uk/dp/0137012896 и http://www.amazon.co.uk/dp/0071625097 (последний, однако, нуждается в некоторых ошибках). К сожалению, нет ничего о CDI и даже о перекрестке между ними (хотя книга Cay немного рассказывает о CDI). Предположительно http://www.amazon.co.uk/dp/0557078326 содержит некоторые из них, но у меня нет времени его читать, поэтому я не знаю точно. –

+0

Большое спасибо Arjan Tijms :) – nyxz

Смежные вопросы