Podem me explicar que erro eh esse?

15 respostas
P

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)

15 Respostas

R

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.

C

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

P

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>&nbsp;</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;
}

...

}

R

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)

P

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>&nbsp;</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>&nbsp;</td>
          <td align="center"><html:hidden property="idEmpresa"/><html:errors property="idEmpresa"/><html:submit property="acao" styleClass="Button" value="gravar"/></td>
        </tr>
P

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?

E

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?

G

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.

E

aonde devo usar o document.getElementById()? a que padrao vc se refere?

G

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.

E

nunca recbebi esses warnings…e só utilizo firefox. utilizo o linux + eclipse com o firefox pra desenvolvimento web.

M

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.

P

ok vlw gujeiros!
:stuck_out_tongue:

E

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

&lt;input class="btSalvar" type="button" value='&lt;bean:message key="insertButton.label"/&gt;' onclick="insert()"/&gt; mas não deu certo…continua o mesmo erro. alguém pode sugerir algo?

M

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 =]

Criado 9 de janeiro de 2007
Ultima resposta 15 de mar. de 2007
Respostas 15
Participantes 6