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...


4 comentários:

  1. Daniel,

    Eu encontrei uma outra maneira de resolver esse problema. Adicionei no start.ini do jetty mais dois parâmetros.São eles:

    Dorg.eclipse.jetty.util.URI.charset=ISO-8859-15

    Dorg.eclipse.jetty.util.UrlEncoding.charset=ISO-8859-15

    e no wrapper.conf:

    wrapper.java.additional.2=-Dorg.eclipse.jetty.util.URI.charset=ISO-8859-15
    wrapper.java.additional.3=-Dorg.eclipse.jetty.util.UrlEncoding.charset=ISO-8859-15

    Assim, aqui não foi necessário alterar os aquivos .jsp.

    ResponderExcluir
    Respostas
    1. Olá Rafael, tudo bem?
      Obrigado por estar colaborando com suas dicas, isso será de grande valia para quem está passando por algum momento como esse.... Esse erro me atormentou por um longo período, e como eu não tinha muito tempo para resolvê-lo, fiquei com a minha alternativa mesmo sabe, o pessoal lá da empresa já não aguentava mais ver esse erro e eu já tinha alterado todas as jsp... Cara, foi tenso! Imagina alterar todas as jsp's do sistema...
      Mas muito obrigado mesmo pela dica e por compartilhar sua experiência com o Jetty!
      Um grande abraço;
      Daniel Hideki

      Excluir
    2. Daniel, Bom dia.

      Vocês ai utilizando estão utilizando algum gerenciador de contexto para o jetty. Aqui na empresa nós utilizamos para o tomcat o probe, que facilita o reinicio das aplicações. Estive olhando se encontrava para o jetty, mas ainda estou sem sucesso.

      Abraço
      Rafael Lima

      Excluir
    3. Boa noite Rafael, tudo bem?
      É, esse também foi um problema pra empresa que eu trabalhava pois lá usávamos o probe juntamente com o Tomcat. Mas existe uma ferramenta que inclusive está dentro do jdk do java, o VisualVM. Uma ferramenta poderosíssima, e que tenho certeza que irá te ajudar. Assim que der, posto alguma coisa sobre ela.
      Espero ter ajudado, um grande abraço;
      Daniel Hideki.

      Excluir