如何在TomEE中启用自定义ExceptionMapper?

时间:2015-12-12 00:09:52

标签: java rest tomee

我有一个针对特定业务异常的自定义Mapper,如下所示:

@Provider
@Singleton
public class MissingHeaderExceptionMapper implements ExceptionMapper<MissingHeaderException> {
    @Override
    public Response toResponse(MissingHeaderException ex) {

抛出异常时不会调用它。

我在TomEE上发现了很多关于这个问题的在线讨论。提供的很多答案显然都是针对专家的,因为我真的不明白他们在谈论什么。

  • 我是否需要配置文件?
  • 如果是,配置名称,我应该把它放在哪里,在哪里可以找到这个配置文件的样本?
  • 如果我必须使用一个类来注册这个自定义的ExceptionMapper,我应该怎么做?

我试图像这个页面建议的那样向项目中添加一个Application对象

http://www-01.ibm.com/support/knowledgecenter/SSEQTP_9.0.0/com.ibm.websphere.base.doc/ae/twbs_jaxrs_defresource_exception_mapper.html

我也关注了此页面中的示例: https://javaspecialist.wordpress.com/2013/09/08/rest-api-exception-handling-using-jax-rs-in-jee-6/

在线有大量的ExceptionMapper示例代码,但是为什么它们都不适用于TomEE。我错过了什么?

修改

我在web.xml中添加了以下配置

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>namespace.MissingHeaderExceptionMapper</param-value>
</context-param>

提供简单的服务

@GET
@Path("/test")
public void test() {
    throw new MissingHeaderException("test");
}

当我尝试调用此端点时,我点击了这一行,以及我的MissingHeaderException的构造函数,但它从未点击过Mapper的构造函数。代码只是继续,我得到了这个

WebApplicationException has been caught, status: 500

在调试器控制台中,我正在

14-Dec-2015 21:46:13.804警告[http-bio-8080-exec-2] org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper.toResponse namespace.MissingHeaderException 在namespace.myService.test

但我的Mapper实际上正在格式化一个很好的错误响应,如下所示:

@Provider
public final class MissingHeaderExceptionMapper implements ExceptionMapper<MissingHeaderException> {

    public MissingHeaderExceptionMapper() {
    }

    @Override
    public Response toResponse(MissingHeaderException ex) {

        ErrorPayload errorPayload = new ErrorPayload();
        errorPayload.setCode("8001008");
        errorPayload.setMessage("Header " + ex.getHeaderName() + " is missing");
        return Response.status(Response.Status.PRECONDITION_FAILED).
                entity(errorPayload).
                type(MediaType.APPLICATION_XML_TYPE).
                build();
    }
}

我没想到只有一行文字,即使是,状态代码也不对......

有些事情是错的,但我现在很困惑。 Java生态系统真的无意让它更容易理解...... :(

0 个答案:

没有答案