WAR文件在tomcat中工作,但在Jetty中出现UTF-8错误,为什么?

时间:2011-03-22 22:01:03

标签: java eclipse tomcat utf-8 jetty

我有使用m2eclipse + Jetty + eclipse本地开发的Java webapp,并且每晚部署到Tomcat。使用Jetty,当我向服务器发送AJAX帖子时,我得到UTF-8 error。相同的代码在tomcat中运行良好。

在Jetty端,我可以看到所有的post参数,并且所有内容都会记录到日志文件中,但是会抛出运行时异常,说明编码无法识别。

我的网页全部编码为UTF-8,帖子中的标题为UTF-8。似乎Jetty或Eclipse中的某些东西不喜欢utf-8编码,我无法弄清楚它可能是什么。

有什么想法吗?

更新:
这是一个堆栈跟踪。

[Click] [error] java.io.UnsupportedEncodingException: UTF-8;org.eclipse.jetty.io.RuntimeIOException: java.io.UnsupportedEncodingException: UTF-8;
    at org.eclipse.jetty.io.UncheckedPrintWriter.setError(UncheckedPrintWriter.java:107)
    at org.eclipse.jetty.io.UncheckedPrintWriter.write(UncheckedPrintWriter.java:280)
    at org.eclipse.jetty.io.UncheckedPrintWriter.write(UncheckedPrintWriter.java:295)
    at org.apache.click.ClickServlet.handleAjaxException(ClickServlet.java:1972)
    at org.apache.click.ClickServlet.handleException(ClickServlet.java:458)
    at org.apache.click.ClickServlet.handleRequest(ClickServlet.java:390)
    at org.apache.click.ClickServlet.doPost(ClickServlet.java:294)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:533)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:475)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:514)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:920)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:403)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:184)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:856)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:247)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:151)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:114)
    at org.eclipse.jetty.server.Server.handle(Server.java:352)
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:596)
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1066)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:805)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
    at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:426)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:510)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.access$000(SelectChannelEndPoint.java:34)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:450)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.UnsupportedEncodingException: UTF-8;
    at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:42)
    at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:83)
    at org.eclipse.jetty.server.HttpWriter.getConverter(HttpWriter.java:268)
    at org.eclipse.jetty.server.HttpWriter.write(HttpWriter.java:125)
    at org.eclipse.jetty.server.HttpWriter.write(HttpWriter.java:107)
    at org.eclipse.jetty.io.UncheckedPrintWriter.write(UncheckedPrintWriter.java:271)
    ... 31 more

2 个答案:

答案 0 :(得分:2)

java.io.UnsupportedEncodingException: UTF-8;

那个分号是可疑的。它不是正常错误消息/跟踪的一部分。

确定您或Ajax未将Content-Type设置为text/html;charset=UTF-8;或其他内容?使用像Firebug这样的HTTP请求跟踪器来确定。我认为这是Jetty中另一个丑陋的bug。显然,标题中并不期望有两个以上的属性。如果你喜欢Jetty,report它给Jetty家伙。

答案 1 :(得分:0)

我找到了问题的答案。我使用的是apache click框架,最近从2.2.0升级到2.3.0-RC1。版本2.3.0-RC1中引入了一个错误,该错误导致在AJAX请求上发送重复的contentType标头。 Tomcat能够优雅地处理错误构造的标题,Jetty不是。

我最终通过覆盖问题函数来应用临时补丁。