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

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

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

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

2 ответа

Решение

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

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

Так что вместо:

private Product product;

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

private Product product = new Product();

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

Другие вопросы по тегам