1

非常に単純なエコープログラムを終了し、名前をサーバーに送信してから、クライアントに送り返しました。しかし、ここに問題があります:

名前は最初に UTF-8 でエンコードする必要があります。%xy%xy%...

次に、それをサーバーに送信します。myhost:9000/send/%xy%xy...

メソッドは次のようになります。

public static Result send(final String name)
{
...
}

データが正しければ、例外やエラーなしで正常にデコードできます。ただし、エンコードされた名前が無効な場合もあります ( %20%A. その結果、デコードできず、内部エラーが発生します。プロセスは「send」メソッドに入ることさえできません。

「myhost:9000/send/%20%A」という URL を入力して、結果 (「間違った名前」であると想定) をクライアントに送信するときに、このエラーをキャッチする方法を知りたいですか?

例外は次のとおりです。

 Unexpected exception
IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
 java.net.URLDecoder.decode(URLDecoder.java:187)
 play.api.mvc.PathBindable$$anon$9.bind(Binders.scala:365)
 play.api.mvc.PathBindable$$anon$9.bind(Binders.scala:364)
 play.core.Router$RouteParams$$anonfun$fromPath$1.apply(Router.scala:1036)
 play.core.Router$RouteParams$$anonfun$fromPath$1.apply(Router.scala:1036)
 scala.Option.map(Option.scala:133)
 play.core.Router$RouteParams.fromPath(Router.scala:1036)
 Routes$$anonfun$routes$1.apply(routes_routing.scala:179)
 Routes$$anonfun$routes$1.apply(routes_routing.scala:87)
 scala.PartialFunction$$anon$3.apply(PartialFunction.scala:67)
 scala.PartialFunction$$anon$3.apply(PartialFunction.scala:66)
 play.core.Router$Routes$class.handlerFor(Router.scala:1251)
 Routes$.handlerFor(routes_routing.scala:14)
 play.api.GlobalSettings$$anonfun$onRouteRequest$1$$anonfun$apply$1.apply(Global.scala:64)
 play.api.GlobalSettings$$anonfun$onRouteRequest$1$$anonfun$apply$1.apply(Global.scala:63)
 scala.Option.flatMap(Option.scala:146)
 play.api.GlobalSettings$$anonfun$onRouteRequest$1.apply(Global.scala:63)
 play.api.GlobalSettings$$anonfun$onRouteRequest$1.apply(Global.scala:63)
 scala.Option.flatMap(Option.scala:146)
 play.api.GlobalSettings$class.onRouteRequest(Global.scala:63)
 play.api.DefaultGlobal$.onRouteRequest(Global.scala:120)
 play.core.server.Server$$anonfun$sendHandler$1$1.apply(Server.scala:60)
 play.core.server.Server$$anonfun$sendHandler$1$1.apply(Server.scala:59)
 scala.Either$RightProjection.map(Either.scala:285)
 play.core.server.Server$class.sendHandler$1(Server.scala:59)
 play.core.server.Server$$anonfun$getHandlerFor$4.apply(Server.scala:89)
 play.core.server.Server$$anonfun$getHandlerFor$4.apply(Server.scala:88)
 scala.Either$RightProjection.flatMap(Either.scala:277)
 play.core.server.Server$class.getHandlerFor(Server.scala:88)
 play.core.server.NettyServer.getHandlerFor(NettyServer.scala:38)
 play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(PlayDefaultUpstreamHandler.scala:226)
 org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563
 org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
 org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:366)
 org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:568)
 org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437)
 org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558)
 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
 org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91)
 org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373)
 org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247)
 org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
 org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
 org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
 java.lang.Thread.run(Thread.java:679)
4

1 に答える 1

0

ドキュメントで説明されているように、BodyPraser を使用する必要があります。

これにより、エンコーディングを手動で検証し、適切なエラーをユーザーに返すことができます。

于 2013-03-04T11:48:59.503 に答える