Jakarta ee 使用自定义org.OSGi.service.http.HttpContext对象在OSGi中注册Servlet失败

Jakarta ee 使用自定义org.OSGi.service.http.HttpContext对象在OSGi中注册Servlet失败,jakarta-ee,servlets,osgi,bundle,apache-felix,Jakarta Ee,Servlets,Osgi,Bundle,Apache Felix,我正在osgi bundle中进行servlet注册。为了支持MIME映射,我想编写HttpContext的自定义实现,并希望HttpService调用它,而不是默认的HttpContext public final class Activator implements BundleActivator{ ... public void start( BundleContext bc ){ private ServiceReference httpServiceRef;

我正在osgi bundle中进行servlet注册。为了支持MIME映射,我想编写HttpContext的自定义实现,并希望HttpService调用它,而不是默认的HttpContext

public final class Activator implements BundleActivator{
   ...
   public void start( BundleContext bc ){

   private ServiceReference httpServiceRef;
   httpServiceRef = bc.getServiceReference( HttpService.class.getName());
   final HttpService httpService = (HttpService) bc.getService( httpServiceRef );

   httpService.registerServlet("/hi",new MyServlet(),new MyHttpContext());}
MyHttpContext如下所示:

public class MyHttpContext implements HttpContext {

@Override
public URL getResource(String name) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public String getMimeType(String name) {
    // TODO Auto-generated method stub
    System.out.println("Name: "+name);
    if (name.endsWith(".jpg"))
        return "image/jpeg";
    else if (name.endsWith(".pdf"))
        return "application/pdf";
    else if (name.endsWith(".txt"))
        return "text/plain";
    else
        return "text/html";

}

@Override
public boolean handleSecurity(HttpServletRequest request,
        HttpServletResponse response) throws IOException {
    // TODO Auto-generated method stub
    return false;
}
当我尝试点击正确的url时,servlet没有被调用。 但是,如果我在registerServlet()中将null作为第三个参数传递,则它可以工作,在这种情况下,httpservice在内部使用默认HttpContext

public final class Activator implements BundleActivator{
   ...
   public void start( BundleContext bc ){

   private ServiceReference httpServiceRef;
   httpServiceRef = bc.getServiceReference( HttpService.class.getName());
   final HttpService httpService = (HttpService) bc.getService( httpServiceRef );

   httpService.registerServlet("/hi",new MyServlet(),new MyHttpContext());}

我的自定义实现可能有什么问题?getResource()方法中是否缺少某些内容?

请参阅handleSecurity函数的javadoc:

如果请求应该得到服务,则返回true;如果请求不应该得到服务,则返回false;Http服务将把响应发送回客户端


谢谢成功了!我已经使用网桥将osgi嵌入到Tomcat7.x中,带有servlet注册的捆绑包就运行在这个网桥上。调用后,我的servlet提供一个.pdf文件,可以通过浏览器下载。我想测试httpservice是否使用我的自定义httpcontext对象来获取此文件的MIME类型。但是,控制台上并没有打印被重写的getMimeType()中的print语句。我无法确定何时调用此被重写的方法。如何确保MIME类型映射由MyHttpContext而不是tomcat处理?我猜您使用的是felix http桥。HandleSecurity总是在调用servlet的服务函数之前由桥调用。仅当您注册的servlet的ServletContext的相同方法被调用时,才会调用GetMimetType()和getResource(..)。我认为它不会被桥调用,除非您的servlet调用它。桥中有一个ResourceServlet(以及桥jar中的http.base)。检查它的来源。您可能希望在HttpContext中注册该servlet。