sexta-feira, 15 de junho de 2012

Erro no Jetty de "Form too large"

Salve galera!
Hoje deparei com um erro em minha aplicação que ao rodar, dava o erro abaixo:


HTTP ERROR: 500
Form too large339783>200000
Caused by:


java.lang.IllegalStateException: Form too large339783>200000
 at org.eclipse.jetty.server.Request.extractParameters(Request.java:1476)
 at org.eclipse.jetty.server.Request.getParameterMap(Request.java:785)
 at javax.servlet.ServletRequestWrapper.getParameterMap(ServletRequestWrapper.java:177)
 at org.apache.struts2.dispatcher.mapper.DefaultActionMapper.handleSpecialParameters(DefaultActionMapper.java:351)
 at org.apache.struts2.dispatcher.mapper.DefaultActionMapper.getMapping(DefaultActionMapper.java:311)
 at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:370)
 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1139)

Esse erro acontece porque o Jetty vem configurado para que o form tenha o tamanho de até 200000. E quando ultrapassa esse valor, estoura o erro de HTTP 500.
E pra variar, fiquei horas tentando descobrir o que fazer....
Mas, depois de muitas e muitas tentativas, consegui tirar a limitação do form. Mas chega de blablabla e
vamos ao que interessa.
Vá até o diretório em que você instalou o seu Jetty
Abra o arquivo Jetty.xml que se encontra dentro da pasta 'etc'.
Insira o código abaixo:


    <!-- ======================================================================= -->
    <!--             Set max form context size default is 200000 and -1 is undefined size                                --> 
    <!-- ======================================================================= -->
<Call class="java.lang.System" name="setProperty"> 
  <Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>  
  <Arg>-1</Arg>  
</Call>

Eu tirei a limitação setando no Arg -1, mas se você preferir que seu form tenha um tamanho específico (alguns dizem que não é seguro deixar um valor indefinido) , é só setar o valor que você quiser dentro do Arg.
Pronto! Só reiniciar o seu Jetty e ele vai rodar legal.
Espero que tenha ajudado e até a próxima!
Um grande abraço;
Daniel Hideki...



segunda-feira, 4 de junho de 2012

Erro de Utf8Appendable$NotUtf8Exception: !UTF-8

Salve galera!
Depois de muitas noites sem dormir, achamos uma solução pra esse problema chato de UTF-8.
Aqui na empresa, migramos do servidor Tomcat para o Jetty, inclusive escrevi aqui de como instalá-lo como serviço de Windows.
Bom, ao migrarmos para o Jetty, tivemos alguns probleminhas, e um deles foi esse erro:

HTTP ERROR 500 

Problem accessing /ProdutoBoB/Equipamento/salvar.action. Reason: 

!UTF-8 
Caused by: 

org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: !UTF-8 
at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:73) 
at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:23) 
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:470) 
at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:521) 
at org.eclipse.jetty.server.Request.extractParameters(Request.java:259) 
at org.eclipse.jetty.server.Request.getParameter(Request.java:662) 
at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:11
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1326) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:940) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409) 
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:874) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110) 
at org.eclipse.jetty.server.Server.handle(Server.java:349) 
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) 
at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:921) 
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:784) 
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:223) 
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:46) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:545) 
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:43) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:59
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533) 
at java.lang.Thread.run(Unknown Source) 
Powered by Jetty:// 


Esse é um problema que ocorre por que em meu form, foi inserido em um campo algum caracter do tipo ISO-8859-1 e o Jetty é por default configurado em UTF-8. Tentei mudar essa configuração de várias maneiras, mas todas sem sucesso. Esse erro persistiu bastante, e posso dizer que durante um bom tempo fiquei horrorizado com ele....
Mas, como também somos persistentes, achamos como arrumá-lo e ser feliz!


A nossa primeira tentativa, foi o meu grande companheiro de trabalho Ricardo Yudi (PROGRAMADOR ARRETADO!!!) que descobriu um jeito de arrumar esse erro. Ele descobriu que havia um bug no IE (Internet Explorer) e que com o procedimento abaixo resolve os nossos problemas. Como fazer isso?
Simples, é só seguir a descrição abaixo:


Setar o atributo do formulário com accept-charset="'UTF-8,ISO-8859-1" 

Criar os campos : 

<input type="hidden" value="&#153;" name="bugIE"


E com isso, uma boa parte de nossos problemas resolveram. 
Infelizmente, como eu disse, uma parte apenas se resolveu....
O tão temido erro Utf8Appendable apareceu novamente para azucrinar os meus neurônios....
E depois de estudar e pesquisar muito, (Santo Google!!!) , achei mais alguns ajustes para que ficasse tudo em perfeita harmonia!
Para configurá-lo, siga os passos abaixo:

Bom, antes de mais nada, precisamos começar pela meta tag.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

No form, temos que setar o atributo accept-charset que meu grande companheiro Ricardo ensinou.
<s:form id="fr_principal" name="name" namespace="/NomedoSeuNameSpace" action="nomeDaAction" acceptcharset="UTF-8">    

E claro, não esquecer de colocar o input:
<input type="hidden" value="&#153;" name="bugIE">

Com essa configuração, as suas páginas podem ter caracteres especiais, e não terão mais o problema de UTF-8Appendable.
Fica aí mais uma dica para esse maravilhoso servidor.
Espero que ajude você, que estava passando pelo mesmo problema!
Um grande abraço;
Daniel Hideki...