RESOLVIDO: Erro: Property 'nome' not found on type java.lang.String - Rich Faces

7 respostas
R

Pessoal,

Alguém tem idéia doque pode estar acontecendo este erro?
javax.faces.FacesException: javax.el.PropertyNotFoundException: /pages/cadastroSprintBacklog.jsp @83,46 value="#{products.nome}": Property 'nome' not found on type java.lang.String
	at javax.faces.component.UIOutput.getValue(UIOutput.java:187)

já sobrescrevi equals, hascode e tostring na minha classe de domínio:

public String toString() {

		return this.nome;

	}

Estou usando o componente rich:listShuttle da seguinte forma:

<rich:listShuttle sourceValue="#{listaSprintBean.productsPBEA}"
	targetValue="#{listaSprintBean.productsPBEASelecionados}"
	var="products" listsHeight="150" sourceListWidth="130"
	targetListWidth="130" sourceCaptionLabel="Estorias Disponiveis"
	targetCaptionLabel="Estorias incluidas no Sprint"  converter="[b]sprintConverter[/b]">					
	<rich:column>
	   <h:outputText value="#{products.nome}"></h:outputText>			
	</rich:column>
	<a4j:support event="onlistchanged" />
	<a4j:support event="onorderchanged" />
 </rich:listShuttle>

tenho um converter: converter="sprintConverter":
Obs: está configurado no faces-config.xml, pelo debug ele chega lá

public class ListSprintBacklog implements javax.faces.convert.Converter {

	private Logger logger;

	public ListSprintBacklog() {
		logger = Logger.getLogger(ListSprintBacklog.class);
	}

	public Object getAsObject(FacesContext facesContext, UIComponent component,
			String string) {
		logger.debug("Convertendo String para Object ProductBacklog");
		ProductBacklogTO filtroPBEA = new ProductBacklogTO();
		Collection<ProductBacklogTO> convertido = null;
		if (string == null) {
			return null;
		}
		filtroPBEA.setNome(string);
		logger.debug("String: " + string);
		convertido = ServiceFactory.getProductBacklogService().findByFilters(filtroPBEA);
		for (ProductBacklogTO product : ServiceFactory.getProductBacklogService().findByFilters(filtroPBEA)) {
			convertido.add(product);
		}		
		return convertido;
	}

	public String getAsString(FacesContext facesContext,
			UIComponent uIComponent, Object object) {
		logger.debug("Convertendo Object ProductBacklog para String");

		if (object == null) {
			return null;
		}
		logger.debug("Object: " + object.toString());
		
		if (object instanceof ProductBacklogTO) {
			ProductBacklogTO o = (ProductBacklogTO) object;
			return "" + (String) o.getNome().toString();
		} else {
			throw new IllegalArgumentException("object:" + object + "of type:"
					+ object.getClass().getName() + "; expected type:"
					+ "br.com.uniube.apm.to.ProductBacklogTO");
		}
	}
}

alguém conseguiria me ajudar? vlw

7 Respostas

V

Você tem uma classe que se chama Produto ou um atributo do tipo string que se chama Produto?

Porque o erro que deu alí foi que ele tentou procurar o atributo nome dentro de uma String chamada produto.

R

tenho uma classe chamada ProductBacklogTO:

/**
 * 
 * @author Renato Nazário
 * @version 1.0
 * @since 15/04/2010 
 * 
 */

@SuppressWarnings("serial")
@Entity
@Table(name = "ProductBacklog")
public class ProductBacklogTO implements Serializable {

	@Id
	@GeneratedValue
	private int codigo_product;

	@Column(name = "nome", length = 200, nullable = false)
	private String nome;


	@Transient
	private String propriedadeFiltro;

	// Getters and Setters

	public int getCodigo() {
		return codigo_product;
	}

	public void setCodigo(int codigo) {
		this.codigo_product = codigo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}



	@Override
	public int hashCode() {

		final int prime = 31;

		int result = 1;

		result = prime * result

		+ ((nome == null) ? 0 : nome.hashCode());

		return result;

	}

	@Override
	public boolean equals(Object obj) {

		if (this == obj)

			return true;

		if (obj == null)

			return false;

		if (getClass() != obj.getClass())

			return false;

		ProductBacklogTO other = (ProductBacklogTO) obj;

		if (nome == null) {

			if (other.nome != null)

				return false;

		} else if (!nome.equals(other.nome))

			return false;

		return true;

	}

	public String toString() {

		return this.nome;

	}

}

retirei os outros atributos para entenderem melhor.

Tenho um managed bean que em retorna este atributo:
private Collection<ProductBacklogTO> construirComboPBEA() {
		productsPBEA = new ArrayList<ProductBacklogTO>();
		ProductBacklogTO filtroPBEA = new ProductBacklogTO();
		filtroPBEA.setPropriedadeFiltro(Constantes.PRODUCTBACKLOG_ESTIMADO_APROVADO);
		for (ProductBacklogTO product : ServiceFactory.getProductBacklogService().findByFilters(filtroPBEA)) {
			productsPBEA.add(product);
		}
		return productsPBEA;

eu recebo a coleção de productsPBEA e retorno armazeno no componente:

<rich:listShuttle sourceValue="#{listaSprintBean.productsPBEA}"  
    targetValue="#{listaSprintBean.productsPBEASelecionados}"  
   var="products" listsHeight="150" sourceListWidth="130"  
    targetListWidth="130" sourceCaptionLabel="Estorias Disponiveis"  
   targetCaptionLabel="Estorias incluidas no Sprint"  converter="[b]sprintConverter[/b]">                     
   <rich:column>  
   <h:outputText value="#{products.nome}"></h:outputText>             
   </rich:column>  
   <a4j:support event="onlistchanged" />  
  <a4j:support event="onorderchanged" />  
</rich:listShuttle>

sugestões em como posso resolver? imagino que deva ser algo simples, mas não estou conseguindo de jeito nenhum...

V

Ola

por gentileza verifica se na sua managed bean estão criados os métodos get and set do "productsPBEA"
e também verifique se o método get esteja sendo chamado depois que o método “construirComboPBEA” tenha sido chamado pelo menos uma vez.

Abraços

R

todos os atributos estão ok, com o get…estranho, olha só o erro que tá dando agora:

java.lang.NumberFormatException: For input string: "nome" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:447) at java.lang.Integer.parseInt(Integer.java:497) at javax.el.ListELResolver.coerce(ListELResolver.java:166) at javax.el.ListELResolver.getValue(ListELResolver.java:51)

ele executa na primeira vez, mostra a lista e tal, mas o problema é quando eu faço qualquer operação, tipo uma ação de voltar…verifiquei que ele sempre chama o converter q defini e dá exception para getAsString, mesmo para outras operações como voltar que não tem nada a ver com isso…tá foda esse erro, tá doido

V

A primeira vez ele tras todos os dados? De acordo com o que está cadastrado no repositório?
E o que você chama de voltar? O voltar do Browser?

Tenta remover o targetValue por um momento, pode ser algum problema na hora de transferir valores por entre as listas, verifique os tipos.

R
na lista que eu chamei de
Available Items
que são armazenados em {listaSprintBean.productsPBEA} todos os dados cadastrados de acordo com a minha consulta são retornados, ok, o problema por exemplo, eu tenho um botão voltar
<h:commandButton value="Voltar" action="#{listaSprintBean.voltarLista}" />
o primeiro problema é esse, ainda nem cheguei na fase de Salvar...hehe segue ae o código da minha jsp de teste:
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:c="http://java.sun.com/jstl/core">

<head>
<title>Cadastro</title>
</head>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:c="http://java.sun.com/jstl/core">

    <style>
.pic {
    margin-bottom: -4px;
    margin-right: 2px;
}
</style>
    <h:form>        
        <rich:spacer height="20" />

        <rich:listShuttle sourceValue="#{listaSprintBean.productsPBEA}" var="items" listsHeight="150"
            sourceListWidth="130" targetListWidth="130" sourceCaptionLabel="Available Items"
            targetCaptionLabel="Currently Active Items">        
            <rich:column>
                <h:outputText value="#{items.nome}"></h:outputText>
            </rich:column>
            <a4j:support event="onlistchanged" reRender="toolBar" />
            <a4j:support event="onorderchanged" reRender="toolBar" />
        </rich:listShuttle>
        <h:commandButton value="Voltar" action="#{listaSprintBean.voltarLista}" />
    </h:form>
</ui:composition>
</html>
quando eu vou para esta página, ok, os itens são visualizados na "Available Items", mas quando eu seleciono a ação voltar, dá a exception sem o converter aplicado:
Caused by: javax.el.PropertyNotFoundException: /pages/cadastroSprintBacklog.jsp @33,53 value="#{items.nome}": Property 'nome' not found on type java.lang.String
	at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:73)
	at javax.faces.component.UIOutput.getValue(UIOutput.java:184)

quando está com o converter converter="sprintConverter" aplicado dá a exception:

Caused by: java.lang.NumberFormatException: For input string: "nome"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:447)
R

hum, o problema do voltar resolvi, ele não podia estar incluído no mesmo form que o componente RichShuttle, não façam isso pessoal, pois podem ter o mesmo problema que eu…vou pro salvar agora do componente, espero que seja tranquilo hehe:

ficou assim:

<h:form> <fieldset><legend>Sprint Backlog</legend> <rich:messages layout="table" infoLabelClass="messageInfo" errorLabelClass="messageError"> <f:facet name="infoMarker"> <h:graphicImage value="/pages/images/msg_success.gif" style=" height : 16px;" /> </f:facet> <f:facet name="errorMarker"> <h:graphicImage value="/pages/images/msg_error.gif" style=" height : 16px;" /> </f:facet> </rich:messages> <rich:listShuttle sourceValue="#{listaSprintBean.productsPBEA}" targetValue="#{listaSprintBean.productsPBEASelecionados}" var="products" listsHeight="150" sourceListWidth="130" targetListWidth="130" sourceCaptionLabel="Estorias Disponiveis" targetCaptionLabel="Estorias incluidas no Sprint" converter="sprintConverter"> <rich:column> <h:outputText value="#{products.nome}"></h:outputText> </rich:column> <a4j:support event="onlistchanged" /> <a4j:support event="onorderchanged" /> <!-- <a4j:support event="onorderchanged" reRender="toolBar" />--> </rich:listShuttle> <a4j:commandButton value="Salvar Sprint Backlog" /> </fieldset> </h:form> <h:form> <h:commandButton value="Voltar" action="#{listaSprintBean.voltarLista}" /> </h:form>

separei o botão do form do listshuttle ae deu certo, vlw pela ajuda pessoal! daqui a pouco já venho com outro problema hehe

Criado 6 de junho de 2010
Ultima resposta 6 de jun. de 2010
Respostas 7
Participantes 2