Прошу прощения, но это неправильно на стольких уровнях, что трудно начать.
Чтобы начать, аннотация @Local
бесполезна в коде, который вы показываете. Он используется для обозначения интерфейса как бизнес-интерфейса для EJB или указания на такой интерфейс.
Затем субъект UserBean
, вероятно, не должен обладать областью действия и управляемым компонентом. Эти аннотации предназначены для того, чтобы позволить контейнеру bean управлять жизненным стилем компонента, но в случае объекта это менеджер объекта, который несет за это ответственность.
Неясно, использовалась ли здесь аннотация JSF или Java EE ManagedBean
, но последняя никогда не нужна, и первая не нужна в соответствии с приведенным выше объяснением.
Кроме того, в соответствии с типичными соглашениями рассмотрите назначение имени только User
и не позволяйте ему реализовать интерфейс.
UserOfUserBean
еще труднее расшифровать. Предполагается ли, что этот компонент является бизнес-сервисом или бэк-файлом (JSF)? Если это бэк-бэк, вам не нужна аннотация @Stateful
, и в противном случае вам не нужен @ManagedBean
.
Тогда главный виновник вашего вопроса: аннотация @EJB не может вводить компоненты, отличные от EJB. Объекты JPA (@Entity
) и управляемые фасолью JSF (@javax.faces.bean.ManagedBean
) не являются компонентами EJB.
Кроме того, атрибут @EJB
beanName
не соответствуют атрибуту 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;
}
}
Некоторые дополнительные ресурсы:
Теперь, когда я вижу это, я говорю «Вы идиот» к себе в прошлом. – nyxz