[Resolvido] Erro JSF - javax.el.PropertyNotFoundException: Target Unreachable

Cenario: Spring, JSF e Hibernate

Erro aparentemente besta e claro:

[quote]
AVISO: /pessoa.xhtml @76,90 value="#{enderecoUI.endereco.logradouro}": Target Unreachable, ‘endereco’ returned null
javax.el.PropertyNotFoundException: /pessoa.xhtml @76,90 value="#{enderecoUI.endereco.logradouro}": Target Unreachable, ‘endereco’ returned null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:97)[/quote]

O erro acontece quando clico no botão Editar, que chama o Dialog,
ao meu entender, qdo eu fizesse

<f:setPropertyActionListener value="#{item}" target="#{enderecoUI.endereco}" />
meu atributo endereco (da classe Endereco) ia contem o valor do registro do dataTable (que é uma lista de enderecos), mas não é isso que está acontecendo aparentemente, causando o Null

EnderecoUI

[code]
@ManagedBean
@SessionScoped
public class EnderecoUI implements Serializable {

private static final long serialVersionUID = 1L;

@ManagedProperty(value = "#{enderecoService}")
private EnderecoService enderecoService;

private List<Endereco> enderecos;
private Endereco endereco;
private Pessoa pessoa;

private Long id;

public EnderecoUI() {
	
}

public void salvar() {
	enderecoService.save(endereco);
	enderecos = enderecoService.find(pessoa);
}

public void editar() {
	//endereco = enderecoService.find(id);
}

public void novo() {
	endereco = new Endereco();
	endereco.setPessoa(pessoa);
}

//Getters & Setters

public EnderecoService getEnderecoService() {
	return enderecoService;
}

public void setEnderecoService(EnderecoService enderecoService) {
	this.enderecoService = enderecoService;
}

public Endereco getEndereco() {
	return endereco;
}

public void setEndereco(Endereco endereco) {
	this.endereco = endereco;
}

public Pessoa getPessoa() {
	return pessoa;
}

public void setPessoa(Pessoa pessoa) {
	this.pessoa = pessoa;
}

public List<Endereco> getEnderecos() {
	enderecos = enderecoService.find(pessoa);
	return enderecos;
}

public void setEnderecos(List<Endereco> enderecos) {
	this.enderecos = enderecos;
}

public Long getId() {
	return id;
}

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

}[/code]

XHTML

[code]
<h:panelGrid id=“panelEndereco” columns=“4”>
<p:dataTable id=“idEndereco” value="#{enderecoUI.enderecos}" var=“item”>
<f:facet name=“header”>
#{messages[‘endereco.lista’]}
</f:facet>

        		<p:column id="colunaLogradouro" headerText="#{messages['endereco.logradouro']}">
					#{item.logradouro}"  
				</p:column>
				<p:column id="colunaRua" headerText="#{messages['endereco.rua']}">
					#{item.rua}  
				</p:column>
				<p:column id="colunaNumero" headerText="#{messages['endereco.numero']}">
					#{item.numero}  
				</p:column>
				<p:column id="colunaBtEdit">
					<p:commandButton id="btEditEndereco" icon="ui-icon-pencil" oncomplete="dlgEndereco.show();">
						<f:setPropertyActionListener value="#{item}"
								target="#{enderecoUI.endereco}" />		
					</p:commandButton>
				</p:column>
				
				<f:facet name="footer">
					<p:commandButton id="novoEndereco" value="#{messages['botao.novo']}" oncomplete="dlgEndereco.show()" 
						style="float:right;" action="#{enderecoUI.novo}" update=":form:display"/>
				</f:facet>
			</p:dataTable>
        </h:panelGrid>
        
        <p:commandButton value="#{messages['botao.salvar']}" id="salvar" ajax="false" action="#{pessoaUI.salvar}" />
        <p:commandButton value="#{messages['botao.voltar']}" id="voltar" ajax="false" action="#{pessoaUI.voltar}"/>
        
        <p:dialog id="dialog" widgetVar="dlgEndereco" resizable="false" width="400">
        	<h:panelGrid columns="2" id="display">
        		<f:facet name="header">
        			#{messages['endereco.titulo']}
        		</f:facet>
        		
           		<p:outputLabel for="endLogradouro" value="#{messages['endereco.logradouro']}"/>
           		<p:inputText id="endLogradouro" value="#{enderecoUI.endereco.logradouro}"/> //linha 76 do erro
           	
           		<p:outputLabel for="endRua" value="#{messages['endereco.rua']}"/>
           		<p:inputText id="endRua" value="#{enderecoUI.endereco.rua}"/>
           	
           		<p:outputLabel for="endNumero" value="#{messages['endereco.numero']}"/>
            	<p:inputText id="endNumero" value="#{enderecoUI.endereco.numero}"/>
           	
           		<f:facet name="footer">
	           		<p:commandButton value="#{messages['botao.salvar']}" action="#{enderecoUI.salvar}">
	           			<f:setPropertyActionListener value="#{pessoaUI.pessoa}"
								target="#{enderecoUI.endereco.pessoa}" />
	           		</p:commandButton>
           		</f:facet>
       		</h:panelGrid>
        </p:dialog>[/code]

Nem meu debug para no metodo enderecoUI.novo =/

Ja tentei trocar de Scope, tentei Request, View (nao sei como funcionam, mas fiz o teste na base da tentativa)

Crie um método para inicializar os objetos e marque-o com a anotação @PostConstruct

Target Unreachable, ‘endereco’ returned null

Ta falando que o cara está null.

No get faça if (endereco == null){ endereco = new Endereco(); } return endereco;

1 curtida

Resolvido colocando process="@this" no commandButton

:slight_smile: :slight_smile: :slight_smile:

Obrigado pessoal

3 curtidas