JSP biblioteca de tag personalizado (Incapaz de encontrar o método setter para o atributo)
-
03-07-2019 - |
Pergunta
Estou tendo problemas com uma marca personalizada: -
org.apache.jasper.JasperException: /custom_tags.jsp(1,0) Incapaz de encontrar o método setter para o atributo: firstname
Esta é minha classe TagHandler:
package com.cg.tags;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class NameTag extends TagSupport{
public String firstname;
public String lastname;
public void setFirstName(String firstname){
this.firstname=firstname;
}
public void setLastName(String lastname){
this.lastname=lastname;
}
public int doStartTag() throws JspException {
try {
JspWriter out=pageContext.getOut();
out.println( "First name: "+firstname+ "Last name: "+lastname);
} catch (Exception ex) {
throw new JspException("IO problems");
}
return SKIP_BODY;
}
}
Este é meu arquivo TLD:
?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlibversion>1.1</tlibversion>
<jspversion>1.1</jspversion>
<shortname>utility</shortname>
<uri>/WEB-INF/nametagdesc.tld</uri>
<info>
A simple tag library for the examples
</info>
<tag>
<name>name</name>
<tagclass>com.cg.tags.NameTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>firstname</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>lastname</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
E esta é a minha página JSP:
<%@ taglib uri="/WEB-INF/nametagdesc.tld" prefix="cg" %>
<cg:name firstname="fname" lastname="lname"/>
Tenho verificado que o código é compilado e implantado corretamente etc etc ....
Assim, a pergunta é, por que não pode encontrar o método setter ???
Solução
Verifique o caso dos atributos no seu elemento tag -. Eles devem corresponder ao caso do setter, não é o caso das variáveis ??de membro (que provavelmente deve ser privado, por sinal)
A regra é que o nome do atributo tem a sua primeira letra maiúscula e, em seguida, o resultado é prefixado por 'set', para chegar ao nome setter.
No seu caso, você chamou a 'firstname'
atributo, portanto, os resultados da regra na o compilador JSP procurando o método 'setFirstName'. Como você nomeou seu 'setFirstName'
setter (com um capital 'N'), você deve usar 'firstName'
(também com um capital 'N') para o nome do atributo.
Aplicar a mesma regra para o atributo 'lastname'
, para chegar a 'lastName'
, e você deve estar no negócio.
P.S. Usando um bom IDE, como IntelliJ
, teria ajudado neste caso, uma vez que teria sugerido os nomes válidos para os seus atributos, poupando-lhe um monte de coçar a cabeça.
Outras dicas
O arquivo TLD no seu exemplo olhares como absurdo, eu não sei se é porque você não tiver formatado corretamente.
O tag elemento para o seu tag personalizado deve ter um atributo elemento que corresponde a cada atributo que você deseja expor. Algo como:
<tag>
<name>...</name>
<tag-class>...</tag-class>
<body-content>...</body-content>
<display-name>...</display-name>
<description>...</description>
<attribute>
<name>firstName</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<description>...</description>
</attribute>
</tag>
Note que, por padrão atributos são Strings. Isso pode ser substituído pela adição de um tipo elemento dentro do atributo elemento.