2011-12-29 3 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, ничего не происходит. Можете ли вы помочь мне найти, где я ошибаюсь в коде?

Уважением, Peter

EDIT: К сожалению, я новичок в Java программирование и часть кода в примерах, которые я не понимаю, как они работают. Будете ли вы так добры, чтобы помочь мне с примером. Мне нужно посмотреть, как этот код должен быть написан надлежащим образом, чтобы использовать его в будущем? Кто-нибудь восстановит код?

Заранее спасибо. Питер

ответ

1

Пару точек:

  1. Из кода вы поставляется, вы на самом деле не создали службу OSGi в вашем пачке.

  2. В вашем сервлете вы фактически не используете никаких объектов OSGi. Ваш метод init пытается получить файл bundleContext, но тогда вы ничего не делаете с ним. Как правило, вы могли бы сделать что-то вроде этого:

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

    и затем вызвать против этого serviceRef.

  3. Вашего сервлет doGet просто полагаться на стандартном создании объекта Java:

    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

Это не ответ. –