Struts 2 - Campo setado na tela aparece como NULL na Action

Olá pessoal!

Estou fazendo uma tela que possui dois combos. O primeiro carrega objetos do tipo Agenda e o segundo do tipo Pessoa.
Eu seleciono a agenda, a pessoa e clico no botão “salvar” que chama uma action que possui um método “gravar” que persiste uma entidade do tipo AgendaPessoa.

O problema é que o combo de pessoas retorna o valor selecionado e o combo de agendas não. Eles estão literalmete iguais. O que pode ser?
Na minha action eu tenho um field que vem de uma super classe e que nessa action está instanciado (via generics) como um objeto do tipo AgendaPessoa. Os valores selecionados na tela são armazenados em entity.agenda.id e entity.pessoa.id. Se mando printar entity.getAgenda().getId(), aparece nulo. Se mando printar entity.getPessoa().getId() aparece o valor selecionado na página. Se manda setar em uma variável (int agendaId) ele seta o valor corretamente.

Trecho da página EditarAgendaPessoa.jsp:

                <div class="quadro_conteudo" >
                    <br/>

                    <p class="formulario">
                        <label>Pessoa:
                            <s:select name="entity.pessoa.id"
                                     list="pessoas"
                                     listKey="id"
                                     listValue="nome"
                                     value="%{entity.pessoa.id}"
                                     headerKey=""
                                     headerValue="-- Selecione --"/>
                        </label>

                        <label>Data:
                            <s:select name="entity.agenda.id"
                                      list="agendas"
                                      listKey="id"
                                      listValue="data"
                                      value="%{entity.agenda.id}"
                                      headerKey=""
                                      headerValue="-- Selecione --"/>
                        </label>
                    </p>

                    <div class="submenu">
                        <ul>
                            <li><s:submit value="Gravar" action="gravar" theme="simple" /></li>
                            <li><s:submit value="Novo" action="incluirnovo" theme="simple" /></li>
                            <li><s:submit value="Cancelar" action="cancelar" theme="simple" /></li>
                        </ul>
                    </div>
                </div>

Action EditarAgendaPessoa.java:

public class EditarAgendaPessoa extends BaseAction<AgendaPessoa,AgendaPessoaService> {
    
    private List<Pessoa> pessoas;
    private List<Agenda> agendas;
    private int agendaId;

    @Override
    public String gravar() {
        System.out.println("agenda: "+entity.getAgenda().getId()); //mostra null
        System.out.println("pessoa: "+entity.getPessoa().getId()); // mostra o valor selecionado
        return super.gravar();
    }

    @Override
    public void prepare() throws Exception {
        super.prepare();
        try {
            pessoas = (List<Pessoa>) getSessionMap().get("pessoas");
            if(pessoas == null){
                pessoas = new ArrayList();
                pessoas = ((PessoaService) getServico("pessoaService")).pesquisarPorExemplo(new Pessoa());
                getSessionMap().put("pessoas", pessoas);
            }

            agendas = (List<Agenda>) getSessionMap().get("agendas");
            if(agendas == null){
                agendas = new ArrayList();
                agendas = ((AgendaService) getServico("agendaService")).pesquisarPorExemplo(new Agenda());
                getSessionMap().put("agendas", agendas);
            }
        } catch (ServiceException ex) {
            Logger.getLogger(EditarAgendaPessoa.class.getName()).log(Level.SEVERE, null, ex);
            reportarErro("Não foi possível carregar a janela. ERRO: "+ex.getMessage());
        }
    }

    public List<Pessoa> getPessoas() {
        return pessoas;
    }

    public List<Agenda> getAgendas() {
        return agendas;
    }

    public int getAgendaId() {
        return agendaId;
    }

    public void setAgendaId(int agendaId) {
        this.agendaId = agendaId;
    }

}

Package para action EditarAgendaPessoa. Veja o método gravar:

    <package name="agendapessoa" namespace="/agendapessoa" extends="struts-default">
        <action name="pesquisaragendapessoa" class="actions.manteragendapessoa.PesquisarAgendaPessoa">
            <result name="success">/manteragendapessoa/PesquisarAgendaPessoa.jsp</result>
        </action>

        <action name="editaragendapessoa" class="actions.manteragendapessoa.EditarAgendaPessoa">
            <result name="success">/manteragendapessoa/EditarAgendaPessoa.jsp</result>
        </action>

        <action name="pesquisar" class="actions.manteragendapessoa.PesquisarAgendaPessoa" method="pesquisar">
            <interceptor-ref name="basicStack"/>
            <result name="success">/manteragendapessoa/PesquisarAgendaPessoa.jsp</result>
            <result name="error">/manteragendapessoa/PesquisarAgendaPessoa.jsp</result>
        </action>

        <action name="editar" class="actions.manteragendapessoa.PesquisarAgendaPessoa" method="editar">
            <result name="editar" type="redirect">editaragendapessoa</result>
            <result name="error">/manteragendapessoa/PesquisarAgendaPessoa.jsp</result>
        </action>

        <action name="gravar" class="actions.manteragendapessoa.EditarAgendaPessoa" method="gravar">
            <result name="success">/manteragendapessoa/EditarAgendaPessoa.jsp</result>
            <result name="error">/manteragendapessoa/EditarAgendaPessoa.jsp</result>
        </action>

        <action name="excluir" class="actions.manteragendapessoa.PesquisarAgendaPessoa" method="excluir">
            <result name="success">/manteragendapessoa/PesquisarAgendaPessoa.jsp</result>
            <result name="error">/manteragendapessoa/PesquisarAgendaPessoa.jsp</result>
        </action>

        <action name="incluir" class="actions.manteragendapessoa.PesquisarAgendaPessoa" method="incluir">
            <result name="incluir" type="redirect">editaragendapessoa</result>
        </action>

        <action name="incluirnovo" class="actions.manteragendapessoa.EditarAgendaPessoa" method="incluirNovo">
            <result name="incluirnovo">/manteragendapessoa/EditarAgendaPessoa.jsp</result>
        </action>

        <action name="cancelar" class="actions.manteragendapessoa.EditarAgendaPessoa" method="cancelar">
            <result name="cancelar" type="redirect">pesquisaragendapessoa</result>
        </action>

    </package>

Classe Agenda:

@Entity
@Table(name="AGENDA", schema = Constantes.SCHEMA)
public class Agenda extends CustomEntity <Long> implements java.io.Serializable {

    private Long id;
    private Date data;
    private Integer quantidadeVaga;    
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "intagendaid", unique = true, nullable = false, insertable = true, updatable = true, precision = 10, scale = 0)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "dtaagenda", unique = false, nullable = true, insertable = true, updatable = true, length = 7)
    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    @Column(name = "intquantidadevaga", unique = false, nullable = true, insertable = true, updatable = true, length = 6)
    public Integer getQuantidadeVaga() {
        return quantidadeVaga;
    }

    public void setQuantidadeVaga(Integer quantidadeVaga) {
        this.quantidadeVaga = quantidadeVaga;
    }

    @Override
    public String toString() {
        String str = "";
        if(getData() != null){
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            str = sdf.format(getData());
        }
        return str;
        //return getData().toString();
    }

Classe Pessoa:

@Entity
@Table(name="PESSOA", schema = Constantes.SCHEMA)
public class Pessoa extends CustomEntity <Long> implements java.io.Serializable {

    private Long id;
    private String nome;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "intpessoaid", unique = true, nullable = false, insertable = true, updatable = true, precision = 10, scale = 0)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the nome
     */
    @Column(name = "strnomepessoa", unique = false, nullable = false, insertable = true, updatable = true, length = 45)
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return getNome();
    }

}

Classe AgendaPessoa:

@Entity
@Table(name="AGENDA_PESSOA", schema = Constantes.SCHEMA)
public class AgendaPessoa extends CustomEntity <Long> implements java.io.Serializable {

    private Long id;
    private Agenda agenda = new Agenda();
    private Pessoa pessoa = new Pessoa();

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "intagendapessoaid", unique = true, nullable = false, insertable = true, updatable = true, precision = 10, scale = 0)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return the agenda
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "intagendaid", unique = false, nullable = false, insertable = true, updatable = true)
    public Agenda getAgenda() {
        return agenda;
    }

    /**
     * @param agenda the agenda to set
     */
    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }

    /**
     * @return the pessoa
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "intpessoaid", unique = false, nullable = false, insertable = true, updatable = true)
    public Pessoa getPessoa() {
        return pessoa;
    }

    /**
     * @param pessoa the pessoa to set
     */
    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    @Override
    public String toString() {
        return ""+getAgenda()+" - "+pessoa.getNome();
    }

}