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); } }
- Facadeパターン
今日の感想
なんだかんだと言いつつも、デザインパターンは共通イメージとして知っておくべき、なのかな
追記
間違っていたので修正。
自動で生成される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部分は消して問題解決した。