非常に単純なエコープログラムを終了し、名前をサーバーに送信してから、クライアントに送り返しました。しかし、ここに問題があります:
名前は最初に 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)