2015-01-02 4 views
1

Я пытаюсь управлять всеми исключениями с помощью ExceptionMapper, как я видел в нескольких документах и ​​примерах. Однако, похоже, это не работает, по крайней мере, в моих условиях.Amdatu: Как заставить ExceptionMapper (@Provider) работать?

Я нахожусь в среде OSGI, используя шаблон Witheboard Felix, с 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.

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

Само Исключение 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)); 
    } 
} 
+0

Так что я просто не могу использовать приложение Amdatu Wink по умолчанию и добавить к нему своего провайдера? Чтобы иметь такое же поведение, мне нужно было скопировать/вставить класс приложения Admatu Wink's Application в мой код, изменить его и зарегистрировать второй сервис приложений (мой) с более высоким приоритетом? – JSlain

+0

Да, это единственный способ. Хотя это довольно просто (приложение по умолчанию действительно тривиально), возможно, это будет еще проще, поэтому я также создал проблему, чтобы улучшить это: https://amdatu.atlassian.net/browse/AMDATUWEB-34 –

+0

Я также подумал, что это должно быть настраиваемым, поскольку мы находимся в модульном мире. В любом случае, спасибо за открытие вопроса! – JSlain

 Смежные вопросы

  • Нет связанных вопросов^_^