【问题标题】:ExceptionMapper provider not working with jerseyExceptionMapper 提供程序不与球衣一起使用
【发布时间】:2018-10-29 16:41:03
【问题描述】:

我正在使用 Jersey 用 java 做一个 Web 服务。 我对球衣的依赖是:

/* JAX-RS Impl (Jersey) */
compile 'org.glassfish.jersey.inject:jersey-hk2:2.27'
compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.27'
compile 'org.glassfish.jersey.media:jersey-media-sse:2.27'
compile 'org.glassfish.jersey.core:jersey-server:2.27'

//Jackson implementation 
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.27'

// Hateoas
compile 'org.glassfish.jersey.ext:jersey-declarative-linking:2.27'

//Jersey Impl test
compile 'org.glassfish.jersey.test-framework:jersey-test-framework-core:2.27'

compileOnly 'javax.servlet:javax.servlet-api:4.0.1'

我的类 Exception 看起来像下一个 sn-p,我正在捕获所有 Throwable 来测试它的工作原理。

package com.apporelbotna.appuestas.rest.exception;

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

@Provider
public class WebserviceExceptionMapper implements ExceptionMapper<Throwable>
{
    public WebserviceExceptionMapper()
    {
        System.out.println("I'm getting created!!! - WebserviceExceptionMapper");
    }

    public Response toResponse(Throwable ex)
    {
        return Response.status(404).build();
    }
}

而我的其他端点看起来像:

@GET
public Response getUsers() throws Exception
{
    throw new Exception("Hi i'm crashing!");
}

我阅读了 Jersey 的文档,但我不明白我可以在课堂上使用 @provider 注册异常映射器。但应用程序无法识别该类。我试图在我的 ResourceConfig 课程中注册我的课程。这很有效。

@Provider
@javax.ws.rs.ApplicationPath("webservice")
public class RestResourceConfig extends ResourceConfig
{
    @Context
    public void setServletContext(ServletContext context)
    {
        if (context != null)
        {
            context.getInitParameter("system.info.allow");
        }
    }

    public RestResourceConfig()
    {
        // Register components in a package
        register(WebserviceExceptionMapper.class);
        packages("com.apporelbotna.appuestas.rest.endpoint");
    }
}

我错过了什么?

【问题讨论】:

    标签: java web-services exception jersey-2.0


    【解决方案1】:

    packages("com.apporelbotna.appuestas.rest.endpoint") 这告诉 Jersey 哪些包要扫描 @Provider@Path 类并注册它们。您可以列出多个包,也可以只使用 com.apporelbotna.appuestas 之类的基本包,Jersey 将递归扫描包。

    因此,如果您希望您的 ExceptionMapper 自动注册,请执行以下操作之一

    packages("com.apporelbotna.appuestas.rest.endpoint",
             "com.apporelbotna.appuestas.rest.exception");
    // -or-
    packages("com.apporelbotna.appuestas.rest");
    

    【讨论】:

    • 那么使用注解有什么意义呢?我认为这是为了避免在 ResourceConfig 中注册。如果添加注解还需要注册?
    • 因为扫描只选择带有注释的类。我在回答中说明了这一点。
    • 感谢@Paul,我一直在努力寻找相同的答案,但在文档中找不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多