Dúvida JSF

2 respostas
J

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,

2 Respostas

Leozin

mas isso é algo óbvio

se você coloca um campo para somente mostrar os dados, por que ele deveria enviar novamente para o servidor?

não é limitação do MyFaces, tanto é que se você fazer isso em qualquer outra implementação de JSF (até naquele lixo de Rave do Netbeans) ele vai continuar com o mesmo erro

quando a tua pagina é renderizada, o objeto em questão é inicializado?

J

Sim, quando a pagina é renderizada, o objeto é exibido corretamente.

Pelo jeito também não posso usar h:inputHidden pois nao posso passar um id do tipo ‘projeto.nome’

Traduzindo … o único jeito disto funcionar é deixar o scope como session mesmo?

Criado 5 de setembro de 2007
Ultima resposta 5 de set. de 2007
Respostas 2
Participantes 2