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:
[code]public String toString() {
return this.nome;
}[/code]
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á
[code]
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");
}
}
}[/code]
alguém conseguiria me ajudar? vlw
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.
tenho uma classe chamada ProductBacklogTO:
[code]
/**
*
-
@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;
}
}[/code]
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…
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
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
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.
na lista que eu chamei de [quote]Available Items[/quote] 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:
[code]
Cadastro
<style>
.pic {
margin-bottom: -4px;
margin-right: 2px;
}
<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>
[/code]
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)
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