Javaエンジニア養成読本 - 11日目

第9章 簡単Java EEチュートリアル[後編]

  • CDI管理Beanの作成
  • MemoBean
package sample.javaee.memoapp.bean;

import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import lombok.Getter;
import lombok.Setter;
import sample.javaee.memoapp.ejb.MemoFacade;
import sample.javaee.memoapp.entity.Memo;

@Named
@ViewScoped
public class MemoBean implements Serializable {
    @Getter @Setter
    private String memo;

    @Getter @Setter
    private List<Memo> memoList;

    @Inject
    private MemoFacade memoFacade;

    @PostConstruct
    public void init() {
        getAllMemo();
    }

    public void createMemo() {
        if (memo.length() > 0) {
            Memo newMemo = new Memo();
            newMemo.setMemo(memo);
            memoFacade.create(newMemo);
            getAllMemo();
        }
    }

    public String updateMemo(Memo editMemo) {
        Flash flash = FacesContext.getCurrentInstance()
                .getExternalContext().getFlash();
        flash.put("editMemoId", editMemo.getId());
        return "memoEdit.xhtml";
    }

    public void deleteMemo(Memo delMemo) {
        memoFacade.remove(delMemo);
        getAllMemo();
    }

    public void getAllMemo() {
        memoList = memoFacade.findAll();
    }
}
  • EditMemoBean
package sample.javaee.memoapp.bean;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import lombok.Getter;
import sample.javaee.memoapp.ejb.MemoFacade;
import sample.javaee.memoapp.entity.Memo;

@Named
@ViewScoped
public class MemoEditBean implements Serializable {
    @Getter
    private Memo editMemo;

    @Inject
    private MemoFacade memoFacade;

    @PostConstruct
    public void init() {
        Flash flash = FacesContext.getCurrentInstance()
                .getExternalContext().getFlash();
        Integer key = (Integer) flash.get("editMemoId");
        editMemo = memoFacade.find(key);
    }

    public void updateMemo() {
        memoFacade.edit(editMemo);
    }
}

今日の感想

なんだかんだと言いつつも、デザインパターンは共通イメージとして知っておくべき、なのかな

追記

間違っていたので修正。
自動で生成されるCDI管理Beanには@Named(value="...")となっているが、そのままにしてたらサーバ起動時にMemoEditBeanがエラーになった。

重大:   Exception while loading the app : CDI deployment failure:WELD-000072: Bean declaring a passivating scope must be passivation capable.  Bean:  Managed Bean [class sample.javaee.memoapp.bean.MemoEditBean] with qualifiers [@Default @Named @Any]

書籍自体にも書いて無かったので、両方value部分は消して問題解決した。