- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试使用特定场景中的 HttpErrorHandler 机制处理异常时遇到了 Play framework (2.6) 中的问题。
我在根包中有一个简单的ErrorHandler:
import play.Logger;
import play.http.HttpErrorHandler;
import play.mvc.Http;
import play.mvc.Result;
import play.mvc.Results;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
public class ErrorHandler implements HttpErrorHandler {
@Override
public CompletionStage<Result> onClientError(Http.RequestHeader request, int statusCode, String message) {
Logger.error("client error");
return CompletableFuture.completedFuture(Results.status(statusCode, "A client error occurred: " + message));
}
@Override
public CompletionStage<Result> onServerError(Http.RequestHeader request, Throwable exception) {
Logger.error("server error");
return CompletableFuture.completedFuture(
Results.internalServerError("A server error occurred: " + exception.getMessage()));
}
}
我创建了一个自定义 Controller 来处理 Assets :
package controllers;
import org.apache.commons.lang3.StringUtils;
import play.api.mvc.Action;
import play.api.mvc.AnyContent;
import play.mvc.Controller;
import javax.inject.Inject;
public class AssetsCustomController extends Controller {
private final Assets assets;
@Inject
public AssetsCustomController(Assets assets) {
this.assets = assets;
}
public Action<AnyContent> at(String path, String file) {
if (StringUtils.isEmpty(path)) {
throw new IllegalArgumentException();
}
return assets.at(path, file, false);
}
}
我已经检查了 ErrorHandler 并且在所有情况下都工作正常,除非从 AssetsCustomController 中的此方法抛出异常:
public Action<AnyContent> at(String path, String file) {
if (StringUtils.isEmpty(path)) {
throw new IllegalArgumentException();
}
return assets.at(path, file, false);
}
例如,当 IllegalArgumentException 被抛出时,我的 ErrorHandler 被忽略并且 Play 使用他的本地错误处理程序。这是堆栈跟踪:
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[IllegalArgumentException: null]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:255)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:182)
at play.api.http.DefaultHttpErrorHandler$.onServerError(HttpErrorHandler.scala:286)
at play.core.server.Server.logExceptionAndGetResult$1(Server.scala:53)
at play.core.server.Server.getHandlerFor(Server.scala:83)
at play.core.server.Server.getHandlerFor$(Server.scala:49)
at play.core.server.AkkaHttpServer.getHandlerFor(AkkaHttpServer.scala:42)
at play.core.server.AkkaHttpServer.getHandler(AkkaHttpServer.scala:215)
at play.core.server.AkkaHttpServer.handleRequest(AkkaHttpServer.scala:195)
at play.core.server.AkkaHttpServer.$anonfun$createServerBinding$3(AkkaHttpServer.scala:107)
Caused by: java.lang.IllegalArgumentException: null
at controllers.AssetsCustomController.at(AssetsCustomController.java:20)
at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$10(Routes.scala:183)
at play.core.routing.HandlerInvokerFactory$$anon$6$$anon$7.call(HandlerInvoker.scala:61)
at play.core.routing.GeneratedRouter$$anon$2.call(GeneratedRouter.scala:251)
at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$9(Routes.scala:183)
at play.core.routing.GeneratedRouter.$anonfun$call$5(GeneratedRouter.scala:99)
at scala.util.Either.fold(Either.scala:118)
at play.core.routing.GeneratedRouter.call(GeneratedRouter.scala:99)
at router.Routes$$anonfun$routes$1.applyOrElse(Routes.scala:182)
at router.Routes$$anonfun$routes$1.applyOrElse(Routes.scala:154)
[解决方案]
多亏了答案 Flo354,我才能够解决问题,AssetsCustomController 是这样的:
package controllers;
import akka.stream.Materializer;
import org.springframework.util.StringUtils;
import play.mvc.Controller;
import play.mvc.Result;
import javax.inject.Inject;
import java.util.concurrent.CompletionStage;
public class AssetsCustomController extends Controller {
private final Assets assets;
private final Materializer materializer;
@Inject
public AssetsCustomController(Materializer materializer, Assets assets) {
this.materializer = materializer;
this.assets = assets;
}
public CompletionStage<Result> at(String path, String file) {
if (StringUtils.isEmpty(path)) {
throw new IllegalArgumentException();
}
return assets.at(path, file, false).asJava().apply(request()).run(materializer);
}
}
最佳答案
你的 Action<AnyContent>
是 Scala API 的一部分,这意味着它不使用 Java 部分。
您的自定义错误处理程序仅适用于 Java 源代码。查看您的堆栈跟踪
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[IllegalArgumentException: null]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:255)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:182)
at play.api.http.DefaultHttpErrorHandler$.onServerError(HttpErrorHandler.scala:286)
....
有play.api.something
可以看出是scala
您可以通过发回 CompletionStage<Result>
来解决此问题
public CompletionStage<Result> test(String path, String file) {
if (StringUtils.isEmpty(path)) {
throw new IllegalArgumentException();
}
return assets.at(path, file, false).asJava().apply(request()).run(materializer);
}
在你的 Controller 中,不要忘记注入(inject) akka.stream.Materializer
的一个实例
希望对您有所帮助!
关于java - Play Framework - ErrorHandler 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45850081/
我有一个 ServiceExecutor 并运行一个很长的例程(网络服务调用、数据库更新、用户更新等)。由于这些例程可能会导致多个错误,因此我希望在一个位置捕获大量错误。因此我用trycatch包裹它
import { Injectable, ErrorHandler, Inject, Injector } from '@angular/core'; import { MessengerServic
我想创建一个自定义弹出窗口,随时通知用户http error来并显示自定义消息。为此,我创建了一个自定义 event handler看起来像: @Injectable() export class C
我有一个要在多台本地计算机上运行的脚本,但是我没有在其中进行任何错误处理。我根本没有在powershell中进行任何错误处理,因此我在这里完全是菜鸟。我读了一些有关它的内容,但老实说,我只是在寻找一个
我正在研究架构验证。目标是获取 XSD 文件并根据它验证传入文档。如果有错误,我想捕获所有错误。 我只在 ErrorHandler 中收到第一个错误,然后处理结束。互联网上有很多人们问同样问题的例子,
我们正在开发一个 Android 应用程序,我们希望使用 crest 库。我们使用的 Web 服务在某些情况下会因错误请求而返回 400,并带有 json 格式的附加响应数据。我们有一个成功的响应处理
我想编写我的第一个 Alexa Skill,但我的第一个 intent 无法正常工作。错误处理程序出现并响应:“抱歉,...” 我想制作一个飞镖计算器,第一个 intent 应该返回: "Ok ${s
有一个简单的应用程序 var express = require('express'); var http = require('http'); var path=require('path'); v
我有一个这样定义的全局错误处理程序(已删除简化/专有信息): export class ErrorsHandler extends CommonBase implements ErrorHandler
我创建了一个带有几个 activeX 元素的 excelfile。到目前为止,该文件正在按预期工作,现在我正在解决日常业务中可能发生的“用户错误”。 以后使用 activeX 元素(Toggle-、C
我正在尝试遵循 this link 中的示例和 this one但我没有显示错误页面,而是收到了 HTTP 500 内部服务器错误。 我有 在 webconfig 中设置。我什至尝试应用 [Handl
在 Debug模式下,@app.errorhandler 工作,但在生产中,我必须设置 PROPOGATE_EXCEPTIONS=1 才能获得行为。我想知道为什么(安全原因?)。其次,设置了 PROP
我在尝试使用特定场景中的 HttpErrorHandler 机制处理异常时遇到了 Play framework (2.6) 中的问题。 我在根包中有一个简单的ErrorHandler: import
当 errorcontroller 插件捕获错误时,它似乎会召回我的其他注册插件(在它们已经被调用之后)。例如,我有一个 viewsetup 插件,它位于 preDispatch ,设置我的应用程序
我已经使用Camel(当前的版本2.12.2)已有一年多了,而我的一个Web应用程序(数百条路由)遇到了一种有趣的情况。为了克服此问题,我想使用特殊的ErrorHandler,如果在特定的扩展路由中抛
我正在尝试在 dropwizard 1.0.2 中设置自定义 ErrorHandler 在我的运行方法的应用程序类中,我有以下几行: environment.getApplicationConte
我正在尝试按照the documentation在Play Framework(2.6)中加载自定义错误处理程序,但收到以下错误消息- Cannot load play.http.errorHandl
我们目前的情况如前所述,我们有一个巨大的 Angular 应用程序,其中在带有错误处理的各种组件中触发了许多 API 调用,因此错误将通过 toast 消息显示给用户。 在我们的 HttpServic
假设我向服务器发送了post请求以创建用户。如果服务器响应错误,我想从ErrorHandler获取我提交(附加到该请求)的正文(窗体)。这样做的原因是,例如,当“创建用户”失败时,我想显示一个通知,其
我正在尝试首次设置错误处理。 它确实可以工作并报告错误(如果有的话),但是由于某种原因,它始终会为错误处理函数本身显示“缺少参数”的错误。请注意,我的错误处理功能在单独的文件中,并且包含在索引页中,我
我是一名优秀的程序员,十分优秀!