【问题标题】:Where to throw customized 404 error in jersey when HttpServer can't find a resource当 HttpServer 找不到资源时,在球衣中在哪里抛出自定义的 404 错误
【发布时间】:2014-10-30 18:32:13
【问题描述】:

我想自定义 404 响应,服务器(不是我)在找不到请求的资源时抛出,(或者自己抛出自定义的 WebApplicationException,如果可以测试请求的资源是否存在于一个应用程序中? 可能资源列表存储在某处?)。 请不要向我推荐建议扩展 WebApplicationException 的解决方案,因为即使这样做,我的问题是何时抛出它?,当找不到资源时!但是如何在 jersey 框架中表达这种需求

【问题讨论】:

  • 到目前为止你做了什么? ExceptionMapper 可能会有所帮助...
  • 您使用哪个版本的泽西岛?
  • 它应该是 Jersey 2.x,带有 grizzly-http-server 2.3.0,我在这里尝试示例 link

标签: jersey http-status-code-404 httpserver


【解决方案1】:

Jersey throws javax.ws.rs.NotFoundException 找不到端点时。只需使用异常映射器将其转换为您选择的响应:

import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class NotFoundExceptionMapper implements ExceptionMapper<NotFoundException> {

    public Response toResponse(NotFoundException exception) {
        return Response.status(Response.Status.NOT_FOUND)
                .entity("No such resource")
                .build();
    }
}

【讨论】:

  • 谢谢,但不幸的是,在将代码添加到我的主类所在的同一个包中并运行 curl -g -i http://localhost:8080/base/@@@11 之后,我收到了没有内容的 404,据我所知 @Provider 在这里告诉服务器这是在找不到资源时要抛出的类,对吗?那么如何让它工作呢?!
  • 我觉得我不需要在某个地方注册,对吗?
  • 如果您已经配置了包扫描并且您在指定的包中放置了提供程序,那么它应该可以工作。 JAX-RS 中有几种类型的提供程序(查看更多:stackoverflow.com/questions/13557442/…)。 ExceptionMappers 允许您捕获任何您想要处理的异常并生成自定义响应。在这种情况下,我们正在处理 NotFoundException,因为当没有找到匹配的资源时,它会被服务器抛出。
  • 启用包扫描,如你所说,我刚刚添加了final ResourceConfig resourceConfig = new ResourceConfig(); Map&lt;String, String&gt; initParams = new HashMap&lt;String, String&gt;(); initParams.put( ServerProperties.PROVIDER_PACKAGES, NotFoundExceptionMapper.class.getPackage().getName());并将resourceConfig传递给GrizzlyHttpServerFactory.createHttpServer
  • 太好了!注册提供者或资源的另一个选项是为每个类单独注册。在这种情况下,它将是 resourceConfig.register(NotFoundExceptionMapper.class) 或通过 init 参数:initParams.put(ServerProperties.PROVIDER_CLASSNAMES, NotFoundExceptionMapper.class)。但是,当您有许多资源和提供者时,包扫描非常有用。您可以将其设置为您的根包,然后每个使用 @Resource@Provider 注释的类都会自动注册。
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2015-10-01
  • 2015-07-09
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多