1

正如我在多个文档和示例中看到的那样,我正在尝试使用 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;
    };
}

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

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

4

1 回答 1

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));
  }
}
于 2015-01-04T15:38:18.380 回答