Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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 如何从OSGI包调用方法?_Java_Jsf_Jsf 2_Ejb 3.0_Osgi - Fatal编程技术网

Java 如何从OSGI包调用方法?

Java 如何从OSGI包调用方法?,java,jsf,jsf-2,ejb-3.0,osgi,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 { p

我已经编写了这个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();
       }


}
这是调用包的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编程新手,示例中的一些代码我不了解它们是如何工作的。你能帮我举个例子吗。我需要看看这个代码必须如何以正确的方式编写,以便在将来使用它?有人会修复代码吗

先谢谢你。 彼得

有几点:

  • 根据您提供的代码,您还没有在包中真正设置OSGi服务

  • 在servlet中,实际上没有使用任何OSGi工具。您的init方法尝试检索bundleContext,但是您永远不会对其执行任何操作。通常您会这样做:

    ServiceReference serviceRef =
        bundleContext.getServiceReference("myService");
    
    然后对该
    serviceRef
    调用

  • 您的servlet
    doGet
    仅依赖于标准Java对象创建:

    try {
        cryptoSha dc = new cryptoSha();
        String nhash = dc.stringHash("test");
    } catch (NoSuchAlgorithmException ex) {
        ex.printStackTrace();
    }
    
    因此,除非
    cryptoSha
    是您的ear的一部分或应用程序类路径中的其他部分,否则我怀疑您在这里遇到了
    NoClassDefFoundError

    但是,即使您创建了
    cryptoSha
    ,您也只是试图为
    字符串nhash
    分配一个值,但是您没有对它做任何操作,因此您的servlet实际上什么也没有做


  • 有一个knopflerfish教程可能会有所帮助:

    您甚至没有指出以具体类的名义将具体类注册为服务是毫无意义的!如果客户机可以看到该类,为什么他们不直接实例化它,而不是通过OSGi服务呢?
    try {
        cryptoSha dc = new cryptoSha();
        String nhash = dc.stringHash("test");
    } catch (NoSuchAlgorithmException ex) {
        ex.printStackTrace();
    }