2011-12-29 4 views
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パッケージを起動すると何も起こりません。私がコード内のどこが間違っているのかを教えてもらえますか?

種類について、 ピーター

EDIT: は、残念ながら私は、Javaプログラミングに新たなんだと私は、彼らがどのように動作するか理解していない例では、コードの一部。あなたは私の例を手伝ってくれてとても親切ですか?私はこのコードを将来どのように適切な方法で書かなければならないかを知る必要があります。誰かがコードを修復しますか?

ありがとうございます。 ピーター

答えて

1

ポイントのカップル:あなたが供給したコードから

  1. は、あなたが本当にあなたのバンドルにOSGiサービスを設定していません。

  2. サーブレットでは、実際にOSGi機能を使用していません。 initメソッドはbundleContextを取得しようとしますが、何もしません。通常、次のような処理を行います。

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

    serviceRefに対して呼び出します。 doGetだけで、標準のJavaオブジェクトの作成に頼っている

  3. あなたのサーブレット:

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

    のでcryptoShaが何らかの形であなたの耳の一部またはその他のアプリケーションのクラスパスにある場合を除き、私はあなたがここにNoClassDefFoundErrorを取得している疑いがあります。

    cryptoShaを作成しても、String nhashに値を割り当てようとしているだけですが、何もしないので、サーブレットは実際に何もしません。

役立つことknopflerfishのチュートリアルがあります:この質問についてhttp://www.knopflerfish.org/osgi_service_tutorial.html

+1

具体的なクラスの名前の下で、具体的なクラスをサービスとして登録するという全く無意味さを指摘していませんでした。クライアントがそのクラスの可視性を持っている場合、なぜOSGiサービスを経由するのではなく、直接インスタンス化しないのでしょうか? –

0

すべてがcargo cult programmingを叫びます。

OSGiとEJBにダイビングする前に簡単なものから始めるのはいかがですか。同時に

+0

これは答えではありません。 –

関連する問題