Olá,
Sou novato com JSF e estou aprendendo do melhor jeito possível: metendo a mão na massa.
Trata-se de um projeto JSF (MyFaces + Tomahawk) + Spring + Hibernate.
Estou com o seguinte problema para fazer atualização de dados da base:
24 Projeto Teste Descrição do Projeto Teste Sep 5, 2007 ALTERAR REMOVER
Esta é uma linha de um dataTable que lista os projetos do usuário.
Ao clicar no botão alterar, é passado para o bean o código do projeto [24] e este obtém as informações do banco, prepopulando um objeto de dominio Projeto contido no ProjetoBean que será usado para compor a tela de alteração.
Segue o código do bean:
public class ProjetoBean {
private static final transient Log log = LogFactory.getLog(ProjetoBean.class);
private Projeto projeto = null;
private ProjetoBo projetoBo = null;
public ProjetoBean() {
projeto = new Projeto();
}
public String cadastrarProjeto() {
log.debug("# Entrou no cadastrarProjeto #");
projeto.setDataCriacao(new Timestamp(System.currentTimeMillis()));
try {
projetoBo.cadastrarProjeto(projeto);
} catch (NegocioException e) {
// TODO retornar erro
}
log.debug("# Saiu do cadastrarProjeto #");
return "sucesso-cadastrar-projeto";
}
public String carregarProjeto() {
log.debug("# Entrou no carregarProjeto #");
try {
projeto = projetoBo.carregarProjeto(projeto.getProjeto());
} catch (NegocioException e) {
// TODO Retornar erro
}
log.debug("# Saiu no carregarProjeto #");
return "sucesso-carregar-projeto";
}
public String removerProjeto() {
try {
projetoBo.removerProjeto(projeto.getProjeto());
} catch (NegocioException e) {
// TODO Retornar erro
}
return "sucesso-remover-projeto";
}
public String alterarProjeto() {
try {
projetoBo.alterarProjeto(projeto);
} catch (NegocioException e) {
// TODO Retornar erro
}
return "sucesso-alterar-projeto";
}
Segue a tela de alteração:
<div id="projetos" class="projetos">
<h:form id="form1">
<h:outputText value="#{projetoBean.projeto.usuario}" />
<h:outputText value="#{projetoBean.projeto.nome}" />
<h:outputText value="#{projetoBean.projeto.dataCriacao}" />
<h:outputText value="#{projetoBean.projeto.descricao}" />
<table>
<tr heigth="20">
<td> </td>
</tr>
<tr>
<td width="40"> </td>
<td width="140"><span class="projetos_text">Nome do Projeto:</span></td>
<td width="200"><h:inputText maxlength="50" value="#{projetoBean.projeto.nome}" styleClass="projetos_input" disabled="true" /></td>
</tr>
<tr>
<td> </td>
<td><span class="projetos_text">Descrição:</span></td>
<td><h:inputTextarea cols="10" rows="3" value="#{projetoBean.projeto.descricao}" styleClass="projetos_input" /></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td align="right">
<h:commandButton action="#{projetoBean.alterarProjeto}" value="Alterar!" styleClass="projetos_botao">
</h:commandButton>
</td>
</tr>
</table>
</h:form>
</div>
Notem que foi colocado logo no começo varios h:outputText para comprovar que o bean foi corretamente pre-populado para fazer a alteracao.
Ao submeter, o conteudo que chega ao projetoBean contém apenas o campo descrição preenchido. o campo nome, que está como disabled, bem como os outros campos que não são possíveis de alteração vem como null.
Isto é uma limitação do Myfaces, onde os campos que não são editados não são enviados ao managed bean.
Mudando o scope do bean para session certamente funcionará, mas não gostaria de adotar essa alternativa.
Alguem conhece algum modo de fazer isto funcionar?
Grato,