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();
}
}