如何在Dropwizard中查看自定义404页面

时间:2016-02-17 15:06:06

标签: java jetty http-status-code-404 dropwizard embedded-jetty

任何人都可以指出我如何查看我的自定义404页面。我用Google搜索并尝试实施ExceptionMapper<RuntimeException>,但这并没有完全发挥作用。我正在使用0.8.1版本

我的异常映射器:

public class RuntimeExceptionMapper implements ExceptionMapper<NotFoundException> {
    @Override
    public Response toResponse(NotFoundException exception) {
        Response defaultResponse = Response.status(Status.OK)
            .entity(JsonUtils.getErrorJson("default response"))
            .build();
        return defaultResponse;
    }
}

这仅适用于不正确的API,而不适用于资源调用

我的设置:

@Override
public void initialize(Bootstrap<WebConfiguration> bootstrap) {
    bootstrap.addBundle(new AssetsBundle("/webapp", "/", "index.html"));
}

@Override
public void run(WebConfiguration configuration, Environment environment) throws Exception {
    environment.jersey().register(RuntimeExceptionMapper.class);
    ((AbstractServerFactory) configuration.getServerFactory()).setJerseyRootPath("/api/*");

    // Registering Resources
    environment.jersey().register(new AuditResource(auditDao));
    ....
}

现在,

http://localhost:8080/api/rubish经过重写的ExceptionMapper方法 http://localhost:8080/rubish.html会生成默认的404页

如何设置以便每当请求未知页面时,dropwizard将显示自定义404页面

我为例外映射器

提供了this链接

2 个答案:

答案 0 :(得分:2)

要为任何错误配置自定义错误页面,您可以在应用程序中配置ErrorPageErrorHandler,如下所示:

@Override
public void run(final MonolithConfiguration config,
                final Environment env) {
    ErrorPageErrorHandler eph = new ErrorPageErrorHandler();
    eph.addErrorPage(404, "/error/404");
    env.getApplicationContext().setErrorHandler(eph);
}

然后创建一个这样的资源:

@Path("/error")
public class ErrorResource {

    @GET
    @Path("404")
    @Produces(MediaType.TEXT_HTML)
    public Response error404() {
       return Response.status(Response.Status.NOT_FOUND)
                      .entity("<html><body>Error 404 requesting resource.</body></html>")
                      .build();
    }

万一你需要它,这里也是ErrorPageErrorHandler的导入:

import org.eclipse.jetty.servlet.ErrorPageErrorHandler;

答案 1 :(得分:1)

如果我理解正确,您想要的是为不匹配的资源请求提供自定义404页面。为此,您可以编写单独的资源类,并在其中编写单独的资源方法。此资源方法应具有

  

@Path(&#34; / {default:。*}&#34;)

注释。此资源方法捕获不匹配的资源请求。在此方法中,您可以提供自己的自定义视图。

为清晰起见,请查看以下代码段

@Path("/")
public class DefaultResource {

  /**
   * Default resource method which catches unmatched resource requests. A page not found view is
   * returned.
   */
  @Path("/{default: .*}")
  @GET
  public View defaultMethod() throws URISyntaxException {
    // Return a page not found view.
    ViewService viewService = new ViewService();
    View pageNotFoundView = viewService.getPageNotFoundView();
    return pageNotFoundView;
  }

}

如果你不知道如何使用dropwizard提供静态资产或者问我,你可以参考this