09/01/2007 10:19:44 org.apache.struts.actions.DispatchAction unspecified
SEVERE: Request[/cadastroEmpresa] does not contain handler parameter named ‘acao’. This may be caused by whitespace in the label text.
09/01/2007 10:19:44 org.apache.struts.action.RequestProcessor processException
WARNING: Unhandled Exception thrown: class javax.servlet.ServletException
09/01/2007 10:19:44 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet action threw exception
javax.servlet.ServletException: Request[/cadastroEmpresa] does not contain handler parameter named ‘acao’. This may be caused by whitespace in the label text.
at org.apache.struts.actions.DispatchAction.unspecified(DispatchAction.java:222)
Podem me explicar que erro eh esse?
15 Respostas
Vc esta tentando chamar um método de um DispatchAction que não está sendo passado pelo parametro ou não existe na action que vc configurou.
Verifique seu struts-config e a passagem do parametro com o nome do método do DispatchAction.
Olá,
teste passando o atributo acao no seu get, exemplo:
http://localhost:8080/teste/cadastroEmpresa.do?acao=incluir
e veja se no seu struts-config.xml esta definido esta acao
Espero ter ajudado
Ricardo Cabral
De acordo com vcs meninos, eu conferi e nao achei nenhuma irregularidade… Podem ver algo que eu esteja errando?
struts-config =
<action
path="/cadastroEmpresa"
attribute="cadastroEmpresaForm"
input="/pages/cadempresa.jsp"
name="cadastroEmpresaForm"
parameter="acao"
scope="request"
type="br.inf.gentec.mtva.patrimonio.EmpresaAction"
validate="false">
<forward name="listar" path="/cadastroEmpresa.do?acao=listar" redirect="true"/>
<forward name="listagem" path="/pages/listaempresa.jsp" />
<forward name="formulario" path="/pages/cadempresa.jsp" />
</action>
codigo que chama a action (acho que tem algum erro relacionado a tag bean:message... pq antes de internacionalizar esta coisa funcionava…) =
<tr>
<td> </td>
<td align="center"><html:hidden property="idEmpresa"/><html:errors property="idEmpresa"/><input type="submit" property="acao" styleClass="Button" value="<bean:message key="cadempresa.btgravar"/>"></td>
</tr>
codigo da action DAO (Dispaction como comentado com nosso colega rodrigoallemand) =
public class EmpresaAction extends DispatchAction{
...
public ActionForward gravar(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response){
ActionForward forward = null;
EmpresaDAO cadastroEmpresaDAO = new EmpresaDAO();
DynaActionForm formBean = (DynaActionForm) form;
EmpresaDTO cadastro = new EmpresaDTO();
try{
//Copia os dados do FormBean do struts para o DTO
BeanUtils.copyProperties(cadastro, formBean);
/*
* Se o ID da empresa é zero, então será
* inserido um novo registro, senão, o registro
* identificado por ID vai ser atualizado.
*/
if(cadastro.getIdEmpresa().equals(new Integer(0))){
cadastroEmpresaDAO.inserir(cadastro);
}else{
cadastroEmpresaDAO.atualizar(cadastro);
}
//Chama essa action novamente para listar os registros
forward = mapping.findForward("listar");
}catch(Exception e){
//Retorna uma pagina com o erro ocorrido na camada de negócio
request.setAttribute("err", e.getMessage());
forward = mapping.findForward("ERRO");
}
return forward;
}
...
}
Conforme dito pelo nosso amigo Cabral, faça um teste passando assim url?acao=metodo, onde método é o nome do método a ser chamado (claro, mas sem o prefixo da action, sem ponto, sem nada, só o nome)
Pessoal resolvi o erro,
estava realmente onde eu suspeitava, troquei a tag bean de internacionalizacao por um html:submit e funcionou…
Eu acho que a internacionalizacao troca o value"xxx" por isso nao funciona.
resposta para quem passará por isso:
-------------ERRO POSTADO NO INICIO
codigo que chama a action (acho que tem algum erro relacionado a tag bean:message... pq antes de internacionalizar esta coisa funcionava…) =
<tr>
<td> </td>
<td align="center"><html:hidden property="idEmpresa"/><html:errors property="idEmpresa"/><input type="submit" property="acao" styleClass="Button" value="<bean:message key="cadempresa.btgravar"/>"></td>
</tr>
--------------RESPOSTA para funcionar, se alguem souber de um jeito melhor, coloque por favor pq isso [color=red]me deixou sem internacionalizar [/color]o texto do botao.
<tr>
<td> </td>
<td align="center"><html:hidden property="idEmpresa"/><html:errors property="idEmpresa"/><html:submit property="acao" styleClass="Button" value="gravar"/></td>
</tr>
pessoal o jeito que eu resolvi nao permite usar o recurso de tradução, ou seja a tag bean dentro da tag html
poderiam ver minha resposta acima e me dar uma clareada?
tb estou com esse problema, q tentei usar um javascript mas nao deu certo…to usando a intercionalização, mas nao creio q deve ser isso. meu struts-config:
<struts-config>
<!-- ActionForm -->
<form-beans>
<form-bean name="IncubadoraForm"
type="org.bios.form.IncubadoraForm" />
</form-beans>
<action-mappings>
<action path="/incubadora"
type="org.bios.action.IncubadoraAction"
name="IncubadoraForm"
scope="request"
validate="true"
input="/WEB-INF/pages/IncubadoraCadastro.jsp"
parameter="method">
<forward name="IncubadoraConsulta" path="/WEB-INF/pages/IncubadoraConsulta.jsp"></forward>
</action>
</action-mappings>
<!-- ============== Controller Configuration -->
<!-- ===== Message Resources Definitions -->
<message-resources parameter="MessageResources" />
</struts-config>
minha action:
public class IncubadoraAction extends DispatchAction{
public ActionForward prepareInsert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
return mapping.getInputForward();
}//fecha método prepareInsert
public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws SQLException {
IncubadoraForm meuForm = (IncubadoraForm) form;
IncubadoraBusiness.insert(meuForm.getDataLeitura(), meuForm.getLeituraDisplay(), meuForm.getLeituraPadrao());
return mapping.findForward("IncubadoraConsulta");
}//fecha método insert
}
ja o meu jsp IncubadoraCadastro.jsp, utilizando o javascript pra chamar o metodo insert da action:
<html:form action="incubadora" focus="">
<bean:message key="dataLeitura.descricao.label"/>
<html:text property="dataLeitura" size="10" maxlength="10"></html:text><br/><br/>
<bean:message key="leituraDisplay.descricao.label"/>
<html:text property="leituraDisplay" size="5" maxlength="5"></html:text><br/><br/>
<bean:message key="leituraPadrao.descricao.label"/>
<html:text property="leituraPadrao" size="5" maxlength="5"></html:text>
<div class="">
<input class="" type="submit" value='<bean:message key="insertButton.label"/>' onclick="insert()"/>
</div>
</html:form>
<script>
function insert(){
document.forms[0].method.value = 'insert';
document.forms[0].submit();
}
</script>
no entanto, recebo o erro: avax.servlet.ServletException: Request[/incubadora] does not contain handler parameter named 'method'. This may be caused by whitespace in the label text.
oq estou fazendo de errado? podem me ajudar a corrigir?
emanoeltadeu,
Vc tah setando um campo na função javascript, mas naum o vi em seu codigo. Naum deveria existir um html:hidden com o property =“method”?
Inclusive deve estar gerando algum erro de javascript.
Dica: Se possível, não acesse os campos diretamente, do jeito que vc fez. Tente usar document.getElementById(), faz parte do padrão.
aonde devo usar o document.getElementById()? a que padrao vc se refere?
ao invés de:
document.forms[0].method.value = 'insert';
usar:
document.getElementById("method").value = 'insert';
Padrão … w3c. Teste no Firefox e provavelmnt vc vai ver os warnings.
nunca recbebi esses warnings…e só utilizo firefox. utilizo o linux + eclipse com o firefox pra desenvolvimento web.
document.getElementById só serve para encontrar elementos com id ou, se você estiver usando o IE, também serve para o identificador name.
O ffx gera um warn se o elemento, “” por exemplo, for acessado diretamente, por exemplo:
teste.value = “abc”
Se você tem um form e quer acessar um elemento, eu recomendo acessar o form e, após, o elemento do form, como o emanoeltadeu já estava fazendo.
emanoeltadeu, você deve estar recebendo duas requisições… com o auxilio do debug poderá ver isto.
O problema é que um faz uma requisição (a menos que o onsubmit do form retorne false, e no seu onclick=“insert()”, você manda fazer outra requisição.
Recomendo que troque o type=“submit” para type=“button” quando for fazer este tipo de coisa (alterar valores do formulário antes de enviá-lo).
No caso da Paulinha NEXT creio eu que hajam mais botões do tipo submit na página, e desta forma cada um chamaria uma ação diferente. Recomendo que use javascript e um campo escondido para controlar qual ação será chamada, assim, não dependeria do value do botão de envio, que também é o texto exibido para o usuário.
O que ela não notou ao “converter” o código para usar internacionalização foi que ela trocou:
<html:submit property="acao" styleClass="Button" value="gravar"/>
para
<input type="submit" property="acao" styleClass="Button"
value="<bean:message key="cadempresa.btgravar"/>">
e não percebeu que, quando o primeiro código era renderizado, o browser recebia
<input type=“submit” name=“acao” class=“Button” value=“gravar”>
e, ao converter, esqueceu de trocar os atributos property e styleClass por name e class. Assim, o browser não reconheceria o atributo property, o struts não recebia a propriedade acao e não encontrava o método de chamada.
ok vlw gujeiros!

primeiramente, agradeço a todos pela ajuda. usando o html:hidden com o property =“method” o document.getElementById() não deu certo…tirei o html:hidden com o property =“method” e usei a sugestão do amigogrustk, colocando
<input class="btSalvar" type="button" value='<bean:message key="insertButton.label"/>' onclick="insert()"/> mas não deu certo…continua o mesmo erro. alguém pode sugerir algo?
emanoeltadeu, se quiser que seu código funcione no IE e no FFX, sugiro que não acesse elementos do formulário via document.getElementById(), a menos que tenha a propriedade ID setada no elemento.
creio que agora, só falta colocar o <html:hidden property="method"/> para funcionar.
informe-nos caso tenha mais dúvidas, ou não =]