gpt4 book ai didi

java - 如何从OSGI包中调用方法?

转载 作者:行者123 更新时间:2023-12-01 15:37:22 24 4
gpt4 key购买 nike

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

}

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

提前谢谢您。彼得

最佳答案

几点:

  1. 根据您提供的代码,您尚未在 bundle 中真正设置 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确实什么也没做。

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

关于java - 如何从OSGI包中调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8672925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com