Curiosidade!

Olá pessoal,
Acaba de acontecer uma das coisas mas estranhas que eu já vi em Java.
A história:
Estava com problemas para mostrar a data da forma que eu queria, aí eu pensei em mostrá-la como String mesmo então fui na minha classe model, Noticia, e criei o atributo ‘sDate’ fiz get e set dele.
O get voltava a data mas como string.
Então fui na minha página e coloquei:

<p>Data:&lt;h:outputText value=" #{noticiaForm.noticiaBusca.sDate}"&gt;&lt;/h:outputText&gt;</p>

noticiaForm é uma Bean session, noticiaBusca é um atributo dessa bean do tipo Noticia.

Recebi o erro:

org.apache.jasper.el.JspPropertyNotFoundException: /resultadoBusca.jsp(51,11) ' #{noticiaForm.noticiaBusca.sDate}' Property 'sDate' not found on type noticia.Noticia
	org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)
	javax.faces.component.UIOutput.getValue(UIOutput.java:176)
	com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:100)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:282)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:208)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:847)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:893)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:889)
	com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:258)
	com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)
	org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:108)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:159)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.

Voltei na minha classe Noticia mudei o nome do atributo ‘sDate’ para ‘dataString’, mudei os nomes dos metodos para o respectivo nome do atributo.
Mudei a chamada:

<p>Data:&lt;h:outputText value=" #{noticiaForm.noticiaBusca.dataString}"&gt;&lt;/h:outputText&gt;</p>

Aí deu certo :shock: :shock:
Depois fiquei testando da mesma forma, mudando o nome sempre de ‘sDate’ para ‘dataString’ e vice-versa.
Quando o nome é ‘sDate’ dá erro, quando é ‘dateString’ funciona!!
Alguém já viu algo parecido??

PS: JSF, Spring, Hibernate.

Ah sim!
Eu usei:

@Transient
	private String dataString;

ou

@Transient
	private String sDate;

Por algum motivo o JSF da esses problemas quando no nome do atributo começa com uma letra minuscula e a segunda é maiuscula.

Também tive problemas assim.

Pode ver que usar

gDate
pObj
mLocker

Tudo vai da o mesmo erro.

E ai jovem… beleza?

Cara… não sei te dizer porque este erro acontece, mas em várias APIs que já utilizei tive este problema. A questão é que quando você tem um atributo que começa com uma letra minúscula e a segunda letra é maiúscula, como é o caso de “sDate”, as APIs só conseguem encontrar o atributo se você referenciá-lo com a primeira letra maiúscula também. No seu caso ficaria assim:

<p>Data:&lt;h:outputText value=" #{noticiaForm.noticiaBusca.SData}"&gt;&lt;/h:outputText&gt;</p>

Acredito que dessa forma ele encontra os métodos get/set! =]

Espero ter ajudado. Até.

Valeu galera!!
dmarcosm, vou tentar com as duas maiúsculas.