簡體   English   中英

Amdatu:如何使ExceptionMapper(@Provider)工作?

[英]Amdatu: How to make ExceptionMapper (@Provider) to work?

正如我在多個文檔和示例中所看到的,我正在嘗試使用ExceptionMapper管理所有異常。 但是,至少在我的條件下,它似乎不起作用。

我在OSGI環境中,使用帶有Amdatu Wink的Felix Witheboard模式,所以我沒有web.xml,所有內容都應該由它自己管理。 我嘗試像使用Web服務一樣將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;
    };
}

不要關注Response本身,我只是在玩。

我的代碼從未被調用過,我應該如何設置該提供程序?

您必須在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));
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM