Передача управляемого EJB-компонента JSF2 в EJB или помещение того, что требуется, в объект передачи - PullRequest
1 голос
/ 12 февраля 2012

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

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

Базовый компонент, хотя POJO сильно аннотирован тегами жизненного цикла JSF (такими как @ManagedBean) и находится в Web project, тогда как EJB-компоненты размещаются отдельно в EJB project.

Ответы [ 2 ]

7 голосов
/ 12 февраля 2012

Звучит так, как будто вы тесно связали модель с контроллером, как показано в большинстве основных руководств по 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>
0 голосов
/ 18 февраля 2014

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

private Product product;

Я должен был использовать:

private Product product = new Product();

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

...