Amdatu:如何让 ExceptionMapper (@Provider) 工作?
Amdatu: How to make ExceptionMapper (@Provider) to work?
我正在尝试使用 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;
};
}
不要关注响应本身,我只是在玩。
我的代码从未被调用,我应该如何设置该提供程序?
您必须在 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));
}
}
我正在尝试使用 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;
};
}
不要关注响应本身,我只是在玩。
我的代码从未被调用,我应该如何设置该提供程序?
您必须在 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));
}
}