Передача управляемого jSF2 pojo bean в EJB или помещение того, что требуется в объект передачи

В настоящее время я вызываю EJB 3 Session Beans из JSF 2. Тем не менее, я не уверен, должен ли я передавать управляемый JSF Beans в EJB?

Предполагая, что все, что на форме (и, таким образом, поддержка bean), - это все, что мне нужно для продолжения через слой EJB, должен ли я клонировать все атрибуты вручную в объект передачи или есть лучший способ делаете это?

Поддержка bean, хотя POJO сильно аннотируется с тегами жизненного цикла JSF (например, @ManagedBean) и находится в Web project, тогда как EJB находятся отдельно в EJB project.

Ответ 1

Звучит так, как если бы вы связали модель с контроллером, как показано в большинстве основных руководств JSF. Вы должны отделить модель от контроллера в своем классе. Поскольку вы используете EJB, вероятность того, что вы также используете JPA (как еще EJB действительно полезны для сохранения?), Вы можете просто использовать существующий класс JPA @Entity как модель.

например.

@Entity
public class Product {

    @Id
    private Long id;
    private String name;
    private String description;
    private Category category;

    // ...
}

с

@ManagedBean
@ViewScoped
public class ProductController {

    private Product product;

    @EJB
    private ProductService service;

    public void save() {
        service.save(product);
    }

    // ...
}

который должен использоваться как

<h:form>
    <h:inputText value="#{productController.product.name}" />
    <h:inputTextarea value="#{productController.product.description}" />
    <h:selectOneMenu value="#{productController.product.category}">
        <f:selectItems value="#{applicationData.categories}" />
    </h:selectOneMenu>
    <h:commandButton value="Save" action="#{productController.save}" />
</h:form>

Ответ 2

Я пытался сделать то же самое с CDI, и основное отличие (исключая использование @Named вместо @ManagedBean) было то, что мне пришлось инициализировать свой транспортный объект в классе Controller.

Итак, вместо:

private Product product;

Мне пришлось использовать:

private Product product = new Product();

Может быть, это поможет кому-то:)