【问题标题】:ExceptionMapper for NotAllowedException in LibertyLiberty 中 NotAllowedException 的 ExceptionMapper
【发布时间】:2017-02-28 02:11:01
【问题描述】:

在 Liberty 上使用 JAX-RS 2.0,我想为各种 javax.ws.rs.WebApplicationException 子类实现一些自定义异常处理,例如 javax.ws.rs.NotAllowedException 用于 405 Method Not Allowed 用例。

我创建了一个ExceptionMapper 实现:

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

@Provider
public class NotAllowedMapper implements ExceptionMapper<NotAllowedException> {

    @Override
    public Response toResponse(NotAllowedException e) {
        return Response.status(Response.Status.METHOD_NOT_ALLOWED).entity("Method Not Allowed")
                .build();
    }

}

并将其添加到我的javax.ws.rs.core.Application 子类中:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/v1.0")
public class JaxRsApplication extends Application {

    /* Other classes and singletons redacted */
    @Override
    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<Object>();

        /* ExceptionMappers for custom exception handling */
        singletons.add(new NotAllowedMapper());

        return singletons;
    }
}

但是,当向仅支持 POST 的端点发出 GET 请求时,我会返回默认的 405 响应,而没有我的自定义实体有效负载。

在生成的警告信息中:

[警告] javax.ws.rs.ClientErrorException: HTTP 405 Method Not Allowed...

我看到正在抛出 javax.ws.rs.ClientErrorException,而不是 javax.ws.rs.NotAllowedException

ClientErrorException 创建一个ExceptionMapper 实现可以让我控制指定我想要的自定义响应,但我宁愿不必对状态代码执行某种 if 结构或 switch 结构来处理通用ClientErrorExceptions 正确。

抛出 ClientErrorException 而不是 NotAllowedException 是否有原因?或者更好的是,是否需要某种配置来获取NotAllowedException,并抛出其他更具体的异常(如果适用)?

【问题讨论】:

  • 我认为您的提供者错过了 @Produces(MIMETYPE) 注释。
  • @Ben 我尝试添加正确的 Produces 注释,但没有任何运气。我还没有看到任何使用 Produces 注释的 ExceptionMapper Provider 示例,但值得一试。

标签: jax-rs websphere-liberty


【解决方案1】:

简短的回答是否定的,没有办法(当前)配置 Liberty 以抛出更具体的 NotAllowedException。

Liberty 使用 Apache CXF 作为底层的 JAX-RS 实现,我快速浏览了源代码,唯一对 NotAllowedException 的引用在 JAX-RS 客户端代码中,这在服务器端对您没有帮助.查看服务器端代码,看起来修改 CXF 以抛出 NotAllowedException 而不是 ClientErrorException 应该不难。 Liberty 组织会定期从 CXF 社区获取更新,因此如果您在 CXF 中打开 JIRA 请求,我们可能能够进行更改并将其拉入即将发布的 Liberty 修复包。

您可以在此处打开 CXF JIRA: https://issues.apache.org/jira/browse/CXF/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary-panel

希望这会有所帮助,安迪

【讨论】:

  • 谢谢安迪。我会接受这个答案,如果我按照你的建议打开一个 JIRA 请求,我会添加一条评论链接。
猜你喜欢
  • 2017-05-29
  • 2011-03-16
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2018-07-06
  • 2012-05-06
相关资源
最近更新 更多