オブジェクトが保持されない ?
次のようなプログラム。
EJB プロジェクト側
jp.mydns.akanekodou.entity.Customer
package jp.mydns.akanekodou.entity; import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.Id; import javax.persistence.Column; import javax.persistence.GeneratedValue; @Entity @Table(name = "顧客マスタ") public class Customer { @Id @Column(name = "顧客ID") @GeneratedValue private int id; @Column(name = "顧客名") private String name; @Column(name = "連絡先") private String phone; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
jp.mydns.akanekodou.dao.CustomerDAO
package jp.mydns.akanekodou.dao; import javax.ejb.Local; import java.util.List; import jp.mydns.akanekodou.entity.Customer; @Local public interface CustomerDAO { List<Customer> all(); Customer find(int id); }
jp.mydns.akanekodou.dao.CustomerDAOBean
package jp.mydns.akanekodou.dao; import javax.ejb.Stateless; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; import javax.persistence.Query; import java.util.List; import jp.mydns.akanekodou.entity.Customer; @Stateless public class CustomerDAOBean implements CustomerDAO { @PersistenceContext(unitName = "customerManager") private EntityManager manager; public List<Customer> all() { Query query = manager.createQuery("from Customer"); @SuppressWarnings("unchecked") List<Customer> list = query.getResultList(); return list; } public Customer find(int id) { return manager.find(Customer.class, id); } }
persistence.xml は省略。
Web プロジェクト側
jp.mydns.akanekodou.CustomerSearch.java
package jp.mydns.akanekodou; import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.component.html.HtmlInputText; import javax.ejb.EJB; import jp.mydns.akanekodou.dao.CustomerDAO; import jp.mydns.akanekodou.entity.Customer; @ManagedBean @RequestScoped public class CustomerSearch implements Serializable { private static final long serialVersionUID = 1L; @EJB private CustomerDAO dao; private Customer item; private HtmlInputText id; public Customer getItem() { return item; } public HtmlInputText getId() { return id; } public void setId(HtmlInputText id) { this.id = id; } public void search() { item = dao.find(Integer.parseInt((String)id.getValue())); } }
search.xhtml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>顧客マスタ参照</title> <h:outputStylesheet library="css" name="search.css" /> </h:head> <h:body> <h1>顧客マスタ参照</h1> <h:form> <table> <tr> <td>顧客ID</td> <td><h:inputText size="5" binding="#{customerSearch.id}" /></td> </tr> <tr> <td>顧客名</td> <td><h:inputText size="20" value="#{customerSearch.item.name}" readonly="true" /></td> </tr> <tr> <td>連絡先</td> <td><h:inputText size="20" value="#{customerSearch.item.phone}" readonly="true" /></td> </tr> </table> <p><h:commandButton action="#{customerSearch.search}" value="検索" /></p> </h:form> </h:body> </html>
これで ID の欄に数字入れて検索ボタンを押すと item が null だと言われて例外が発生する。この方法でデータを取得することはできないんだろうか ?
追記 : とりあえずコンポーネントでない値は自動では保持してくれないことはわかったけど…。
追記 2 : 解決。管理 Bean のアクションの返り値が拙かった。こうだ。
package jp.mydns.akanekodou; import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.component.html.HtmlInputText; import javax.ejb.EJB; import jp.mydns.akanekodou.dao.CustomerDAO; import jp.mydns.akanekodou.entity.Customer; @ManagedBean public class CustomerSearch implements Serializable { private static final long serialVersionUID = 1L; @EJB private CustomerDAO dao; private Customer item; private HtmlInputText id; public Customer getItem() { return item; } public HtmlInputText getId() { return id; } public void setId(HtmlInputText id) { this.id = id; } public String search() { item = dao.find(Integer.parseInt((String)id.getValue())); return ""; } }
scope のアノテーションは特に付けなくてもいいみたい。