ExceptionMapper провайдер не работает с Джерси - PullRequest
0 голосов
/ 29 октября 2018

Я делаю Web-сервис в Java, используя Джерси. мои зависимости для Джерси:

/* 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 выглядит как следующий фрагмент, я ловлю все 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!");
}

Я прочитал документацию по Джерси и понимаю, что могу зарегистрировать преобразователи исключений, используя @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");
    }
}

Что мне не хватает?

1 Ответ

0 голосов
/ 06 ноября 2018

packages("com.apporelbotna.appuestas.rest.endpoint") Указывает Джерси, какой пакет (ы) нужно сканировать на предмет классов @Provider и @Path и регистрировать их. Вы можете перечислить несколько пакетов или просто использовать базовый пакет, например com.apporelbotna.appuestas, и Джерси будет рекурсивно сканировать пакет.

Итак, если вы хотите, чтобы ваш ExceptionMapper был зарегистрирован автоматически, выполните одно из следующих действий

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