Ответ 1
Аннотации @Named или @ManagedBean обычно используются для того, чтобы контейнер bean (CDI/JSF) создавал экземпляр bean по запросу при ссылке на язык выражения в JSF.
Для @Entity bean часто не так просто получить произвольный новый экземпляр. @Entity очень сильно связан с постоянной идентификацией. Такой объект запрашивается из Entity Manager
, а не из контейнера bean.
Типичный шаблон состоит в том, чтобы иметь (slim) поддержку bean, которая назвала обращение к службе (которая, в свою очередь, обычно является @Stateless в Java EE). Затем служба возвращает объекты.
В некоторых очень тривиальных системах люди иногда делают сервис названным и, таким образом, напрямую доступным для EL. Тем не менее, в конечном итоге вы часто хотите, чтобы "код поддержки" генерировал сообщения лиц или дескриптор (таблицы), которые представляют собой все, что не должно заботиться о чистом бизнес-сервисе.
Другим распространенным ярлыком является то, что резервная копия bean содержит бизнес-код напрямую (например, менеджер объектов, который извлекает объекты). Это затрудняет повторное использование бизнес-кода, но если приложение тривиально, и нет необходимости в повторном использовании, вы можете с ним справиться.
Но предоставление сущности -be-backing bean является редкими и противоречит общим шаблонам Java EE.
Просто помните, что поддержка bean может возвращать объект напрямую, поэтому bean -validation все еще можно использовать. Нет никакой необходимости в том, что странный образец "рассеивания/сбора", который давно закрался (см. Второй пример в этот вопрос).
например.
@ViewScoped
@ManagedBean
public class BackingBean {
private SomeEntity myEntity; // + getter
@EJB
private Service service;
@PostConstruct
public void init() {
myEntity = service.getSomeEntity();
}
public void save() {
service.save(myEntity);
FacesContext.getCurrentInstance().addMessage(..., ...);
}
}
Предполагая SomeEntity
в аннотированной @Entity bean, bean валидация теперь может использоваться на Facelet как:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
>
<h:body>
<h:form>
<h:inputText value="#{backingBean.myEntity.name}" />
<h:commandButton value="Save" action="#{backingBean.save}" />
</h:form>
</h:body>
</html>
Если существует ограничение на SomeEntity.name
, оно будет проверено.