オブジェクトが保持されない ?

次のようなプログラム。

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 のアノテーションは特に付けなくてもいいみたい。