【问题标题】:Amdatu: How to make ExceptionMapper (@Provider) to work?Amdatu:如何使 ExceptionMapper (@Provider) 工作?
【发布时间】:2015-01-02 15:51:00
【问题描述】:

我正在尝试使用 ExceptionMapper 管理我的所有异常,正如我在多个文档和示例中看到的那样。但是,至少在我的情况下,它似乎不起作用。

我在 OSGI 环境中,使用 Felix Witheboard 模式和 Amdatu Wink,所以我没有 web.xml,一切都应该由自己管理。 我尝试将我的 ExceptionMapper 注册为服务,就像我对我的 Web 服务所做的那样,但没有结果。

@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;
    };
}

不要关注响应本身,我只是在玩。

我的代码从未被调用,我应该如何设置该提供程序?

【问题讨论】:

    标签: java osgi jax-rs amdatu


    【解决方案1】:

    您必须在 javax.ws.rs.core.Application 中注册提供程序。该应用程序应注册为具有比 Amdatu Wink 包创建的默认服务排名更高的服务。

    以下是一个工作示例。

    异常映射器本身:

    @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));
      }
    }
    

    【讨论】:

    • 所以我不能使用默认的 Amdatu Wink 的应用程序并添加我自己的 Provider 吗?要具有相同的行为,我需要将默认 Admatu Wink 的 Application 类复制/粘贴到我的代码中,对其进行修改并注册第二个具有更高优先级的 Application 服务(我的)?
    • 是的,这是目前唯一的方法。虽然它很简单(默认应用程序真的很简单),但它可能更容易,所以我还创建了一个问题来改进它:amdatu.atlassian.net/browse/AMDATUWEB-34
    • 我还认为这应该是可配置的,因为我们处于模块化世界中。无论如何感谢您打开问题!
    猜你喜欢
    • 2018-06-21
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多