gpt4 book ai didi

java - 多路由处理 - 使用自己的请求处理程序时出现异常

转载 作者:行者123 更新时间:2023-11-30 10:45:07 24 4
gpt4 key购买 nike

我正在使用 play 2.5.3 并且在子项目下有 2 个路由文件。想法是使用域相关的路由文件。代码结构:

root
- modules
- core
- admin
- admin.routes
- web
- web.routes

我的 RequestHandler 看起来像这样--

public class MyRequestHandler implements HttpRequestHandler {    
@Inject
public MyRequestHandler(web.Routes webRoutes, admin.Routes adminRoutes) {
this.webRoutes = webRoutes;
this.adminRoutes = adminRoutes;
}

@Override
public HandlerForRequest handlerForRequest(Http.RequestHeader request) {
String subDomain = getSubDomain(request);
if("admin".equalsIgnoreCase(subDomain)){
Handler handler = adminRoutes.asJava().route(request).get();
return new HandlerForRequest(request,handler);
}else{
Handler handler = webRoutes.asJava().route(request).get();
return new HandlerForRequest(request,handler);
}
}

}

获取以下异常-

2016-05-10 13:02:29,956 - [ERROR] - p.c.s.n.PlayRequestHandler - Exception caught in Netty
scala.MatchError: Right((play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$14$$anon$3@50a3f51b,play.api.DefaultApplication@2072c28f)) (of class scala.util.Right)
at play.core.server.netty.PlayRequestHandler.handle(PlayRequestHandler.scala:93)
at play.core.server.netty.PlayRequestHandler.channelRead(PlayRequestHandler.scala:163)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:278)
at com.typesafe.netty.http.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:129)
at com.typesafe.netty.http.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:96)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:278)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292)
2016-05-10 13:02:34,020 - [ERROR] - p.c.s.n.PlayRequestHandler - Exception caught in Netty

请在这方面帮助我们。或者让我们知道是否还有其他方法。

最佳答案

  1. 如果您有 Java Controller ,则需要使用 play.api.http.JavaCompatibleHttpRequestHandler 在 Scala 中实现它,或者在 Java 中使用 play.http.DefaultHttpRequestHandler 实现它。一般假设 Java 用户将使用 play.http.* 类,而 Scala 用户将使用 play.api.http.* 类。

  2. 由于 Handler 是一个 play.api.mvc.Handler (Scala),路由实际上仅在路由到 Scala Controller 时有效。如果您尝试路由到 Java Controller ,那么您将收到我上面描述的错误。所以,如果你返回的Handler是一个JavaHandler,你需要调用handler.withComponents(components),这里components是一个注入(inject)的JavaHandlerComponents。这将返回 Play Netty 服务器将能够处理的 EssentialAction 实例。

https://github.com/playframework/playframework/blob/2.5.4/framework/src/play/src/main/scala/play/api/http/HttpRequestHandler.scala#L206 (覆盖 def routeRequest)

关于java - 多路由处理 - 使用自己的请求处理程序时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37177687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com