Как вызвать метод из пакета OSGI? - PullRequest
0 голосов
/ 30 декабря 2011

Я написал этот пакет 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 ]

1 голос
/ 30 декабря 2011

Пара баллов:

  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

0 голосов
/ 30 декабря 2011

Все в этом вопросе кричит программирование грузового культа .

Как насчет того, чтобы начать с чего-то простого, прежде чем погрузиться в OSGi и EJB ... одновременно ?

...