Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Amdatu:如何让ExceptionMapper(@Provider)工作?_Java_Osgi_Jax Rs_Amdatu - Fatal编程技术网

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

Java Amdatu:如何让ExceptionMapper(@Provider)工作?,java,osgi,jax-rs,amdatu,Java,Osgi,Jax Rs,Amdatu,正如我在多个文档和示例中看到的那样,我正在尝试使用ExceptionMapper管理所有异常。然而,它似乎不起作用,至少在我的情况下是这样 我在一个OSGI环境中,使用Felix with eboard模式和Amdatu Wink,所以我没有web.xml,一切都应该由它自己管理。 我尝试将ExceptionMapper注册为一个服务,就像我使用web服务一样,但没有结果 @Component(immediate=true, provide={Object.class}) @Provider p

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

我在一个OSGI环境中,使用Felix with eboard模式和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;
    };
}
@Component(immediate=true,provide={Object.class})
@提供者
公共类SessionTimeoutExeptionHandler实现ExceptionMapper{
公共响应(SessionTimeoutException arg0){
Response toReturn=响应状态(状态禁止)
.entity(“会话超时”)
.build();
回归回归;
};
}
不要在意反应本身,我只是在胡闹


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

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

下面是一个工作示例

异常映射程序本身:

@Provider
public class SecurityExceptionMapper implements ExceptionMapper<SecurityException>{
  @Override 
  public Response toResponse(SecurityException arg0) {
    return Response.status(403).build();
  }
}

所以我不能使用默认的Amdatu Wink应用程序并向其中添加我自己的提供者?要实现同样的行为,我需要将默认Admatu Wink的应用程序类复制/粘贴到我的代码中,修改它并注册第二个优先级更高的应用程序服务(我的)?是的,这是目前唯一的方法。虽然它非常简单(默认应用程序非常简单),但可能更简单,因此我还提出了一个问题来改进这一点:我还认为这应该是可配置的,因为我们处在一个模块化的世界中。无论如何,谢谢你打开这个问题!
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));
  }
}