Извините, но на многих уровнях это неправильно, так что трудно начать.
Для начала аннотация @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;
}
}
Некоторые дополнительные ресурсы: