Amdatu: Как заставить ExceptionMapper (@Provider) работать?

Я пытаюсь управлять всеми своими исключениями с помощью ExceptionMapper, как я видел в нескольких документах и ​​примерах. Однако, похоже, это не работает, по крайней мере, в моих условиях.

Я нахожусь в среде OSGI, использующей шаблон Felix Witheboard с Amdatu Wink, поэтому у меня нет web.xml, и все должно управляться само собой. Я пытался зарегистрировать свой ExceptionMapper как сервис, как я делал это с моими веб-сервисами, но безрезультатно.

@Component(immediate=true, provide={Object.class})
@Provider
public class SessionTimeoutExeptionHandler implements ExceptionMapper<SessionTimeoutException>{

    public Response toResponse(SessionTimeoutException arg0) {
        Response toReturn = Response.status(Status.FORBIDDEN)
                .entity("session_timeout")
                .build();

        return toReturn;
    };
}

Не обращайте внимания на сам Ответ, я просто играл.

Мой код никогда не вызывается, как я должен настроить этот провайдер?

1 ответ

Решение

Вы должны зарегистрировать провайдера в javax.ws.rs.core.Application. Это приложение должно быть зарегистрировано как сервис с более высоким рейтингом сервиса, чем приложение по умолчанию, созданное пакетом Amdatu Wink.

Ниже приведен рабочий пример.

Сам Exception Mapper:

@Provider
public class SecurityExceptionMapper implements ExceptionMapper<SecurityException>{
  @Override 
  public Response toResponse(SecurityException arg0) {
    return Response.status(403).build();
  }
}

Приложение:

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

public class MyApplication extends Application {

  @Override
  public Set<Object> getSingletons() {
    Set<Object> s = new HashSet<Object>();

    s.add(new JacksonJsonProvider());
    s.add(new SecurityExceptionMapper());

    return s;
  }
}

Активатор, устанавливающий свойство ранжирования сервиса.

public class Activator extends DependencyActivatorBase{
  @Override
  public void destroy(BundleContext arg0, DependencyManager arg1) throws Exception {
  }

  @Override
  public void init(BundleContext arg0, DependencyManager dm) throws Exception {

    Properties props = new Properties();
    props.put(Constants.SERVICE_RANKING, 100);

    dm.add(createComponent().setInterface(Application.class.getName(), props).setImplementation(MyApplication.class));
  }
}
Другие вопросы по тегам