如何从OSGI包中调用方法?

时间:2011-12-29 20:18:09

标签: java jsf jsf-2 ejb-3.0 osgi

我写过这个OSGI包:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CryptoLib;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class cryptoSha {

    public cryptoSha() {
    }

    /** method for converting simple string into SHA-256 hash */
       public String stringHash(String hash) throws NoSuchAlgorithmException{

            MessageDigest md = MessageDigest.getInstance("SHA-256");
            md.update(hash.getBytes());

            byte byteData[] = md.digest();

            /** convert the byte to hex format */
            StringBuilder sb = new StringBuilder();
                for (int i = 0; i < byteData.length; i++) {
            sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
            }              
           return sb.toString();
       }


}

这是Acticator类:

        package com.CL_67;

import CryptoLib.cryptoSha;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {
    private static BundleContext context;   

    public void start(BundleContext context) throws Exception {
        Activator.context = context;
        context.registerService(cryptoSha.class.getName(), new cryptoSha(), null);
        System.out.println("Module CL-67 is Loaded ...");              
    }

    public void stop(BundleContext context) throws Exception {
        context.ungetService(context.getServiceReference(cryptoSha.class.getName()));
        Activator.context = null;
        System.out.println("Module CL-67 is Unloaded ...");      
    }

}

这是调用捆绑包的EAR包:

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.osgi.framework.BundleContext;

@Named("loginController")
@SessionScoped
public class userCheck extends HttpServlet implements Serializable {

       public userCheck(){
       }

       @WebServlet(name = "CL_67", urlPatterns = {"/CL_67"})
    public class cryptoSha extends HttpServlet {

    @Inject
    cryptoSha stringHash;
}


   @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println(cryptoSha.stringHash("test"));
    }

   }
}       

我在JBoss 7.1.0上成功编译和部署,但是当我启动EAR包时没有任何反应。你能帮我找一下我在代码中的错误吗?

亲切的问候, 彼得

编辑: 不幸的是,我是java编程的新手,并且示例中的一些代码我不明白它们是如何工作的。你能帮我这个例子吗?我需要看看如何以适当的方式编写此代码以便在将来使用它?有人会修复代码吗?

提前谢谢你。 彼得

2 个答案:

答案 0 :(得分:1)

有几点:

  1. 根据您提供的代码,您尚未在捆绑中真正设置OSGi服务。

  2. 在您的servlet中,您实际上并未使用任何OSGi工具。你的init方法试图检索bundleContext,但是你不会对它做任何事情。通常你会做这样的事情:

    ServiceReference serviceRef =
        bundleContext.getServiceReference("myService");
    

    然后调用serviceRef

  3. 您的servlet doGet只依赖于标准的Java对象创建:

    try {
        cryptoSha dc = new cryptoSha();
        String nhash = dc.stringHash("test");
    } catch (NoSuchAlgorithmException ex) {
        ex.printStackTrace();
    }
    

    因此,除非cryptoSha在某种程度上属于您的应用程序类路径,否则我怀疑您在此处获得了NoClassDefFoundError

    但即使你创建了cryptoSha,你只是想为String nhash分配一个值,但是你不会对它做任何事情,所以你的servlet确实什么也没做。

  4. 有一个knopflerfish教程可能有所帮助:http://www.knopflerfish.org/osgi_service_tutorial.html

答案 1 :(得分:0)

关于这个问题的一切都尖叫cargo cult programming

在深入了解OSGi和EJB之前,先从简单的事情开始...... 同时