1. 程式人生 > >Equinox OSGi應用嵌入Jersey框架搭建REST服務

Equinox OSGi應用嵌入Jersey框架搭建REST服務

基本 lis upd sources sgi amp png n) 兩個

原文地址:https://www.cnblogs.com/kira2will/p/5040264.html

一、環境

eclipse版本:eclipse-luna 4.4

jre版本:1.8

二、Equinox OSGi應用嵌入Jersey框架搭建REST服務

1.新建插件工程HelloWebOSGI

a.

技術分享圖片

b.

技術分享圖片

c.

技術分享圖片

d.在新建的工程中新建文件夾lib,其中放入附件中的jar包(見文末),全部添加到工程Build Path中。

技術分享圖片

技術分享圖片

2.配置運行環境

a.配置引入包、依賴插件

技術分享圖片

b.選擇Run->Run Configuration,new一個環境

技術分享圖片

保留圖中TargetPlatform中的16個Bundle。

c.在Run Configuration中設置參數

技術分享圖片

友情提示:如果有其他異常請查看提示信息,利用 http://www.aolsearch.com/ 查詢提示信息(英文),如果發現http://stackoverflow.com/這個網站有相同提問,基本就知道答案近在咫尺了。

比如筆者遇到的問題:Root exception:java.lang.IllegalStateException: Workbench has not been created yet.

解決方法就是在http://stackoverflow.com/questions/13773582/workbench-has-not-been-created-yet-error-in-eclipse-plugin-programming中找到的。

d.在MANIFEST.MF(META-INF)文件中將lib文件夾中的包都引入如下圖中。

技術分享圖片

3.添加代碼

技術分享圖片

Activator_sample.java

package helloworldosgi;

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.logging.Logger;

import javax.servlet.ServletException;

import org.glassfish.jersey.servlet.ServletContainer;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; import org.osgi.service.http.HttpService; import org.osgi.service.http.NamespaceException; import org.osgi.util.tracker.ServiceTracker; /* * BundleActivator:讓你能夠捕捉到bundle的start和stop事件,並對這兩個事件作出自定義的反應。 */ public class Activator_sample implements BundleActivator { private BundleContext bc; @SuppressWarnings("rawtypes") private ServiceTracker tracker; private HttpService httpService = null; private static final Logger logger = Logger.getLogger(Activator.class.getName()); /** * URL前綴 */ public static final String CONTEXT_PATH = "/rest/json"; /* * BundleContext:一個bundle在框架中的執行時上下文,這個上下文提供了和框架進行交互的方法。 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public synchronized void start(BundleContext bundleContext) throws Exception { this.bc = bundleContext; logger.info("STARTING HTTP SERVICE BUNDLE"); this.tracker = new ServiceTracker(this.bc, HttpService.class.getName(), null) { @Override public Object addingService(ServiceReference serviceRef) { httpService = (HttpService) super.addingService(serviceRef); registerServlets(); return httpService; } @Override public void removedService(ServiceReference ref, Object service) { if (httpService == service) { unregisterServlets(); httpService = null; } super.removedService(ref, service); } }; this.tracker.open(); logger.info("HTTP SERVICE BUNDLE STARTED"); } /* * BundleContext:一個bundle在框架中的執行時上下文,這個上下文提供了和框架進行交互的方法。 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ @Override public synchronized void stop(BundleContext bundleContext) throws Exception { this.tracker.close(); } private void registerServlets() { try { rawRegisterServlets(); } catch (InterruptedException | NamespaceException | ServletException ie) { throw new RuntimeException(ie); } } private void rawRegisterServlets() throws ServletException, NamespaceException, InterruptedException { logger.info("JERSEY BUNDLE: REGISTERING SERVLETS"); logger.info("JERSEY BUNDLE: HTTP SERVICE = " + httpService.toString()); // TODO - temporary workaround // This is a workaround related to issue JERSEY-2093; grizzly (1.9.5) // needs to have the correct context // classloader set ClassLoader myClassLoader = getClass().getClassLoader(); ClassLoader originalContextClassLoader = Thread.currentThread() .getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(myClassLoader); httpService.registerServlet(CONTEXT_PATH, new ServletContainer(), getJerseyServletParams(), null); httpService.registerResources(CONTEXT_PATH + "/hello", "/webroot", null);//前面必須帶“/”,後面不一定 } finally { Thread.currentThread().setContextClassLoader( originalContextClassLoader); } // END of workaround - after grizzly updated to the recent version, only // the inner call from try block will remain: // httpService.registerServlet("/jersey-http-service", new // ServletContainer(), getJerseyServletParams(), null); sendAdminEvent(); logger.info("JERSEY BUNDLE: SERVLETS REGISTERED"); } @SuppressWarnings("serial") private void sendAdminEvent() { @SuppressWarnings("rawtypes") ServiceReference eaRef = bc.getServiceReference(EventAdmin.class .getName()); if (eaRef != null) { @SuppressWarnings("unchecked") EventAdmin ea = (EventAdmin) bc.getService(eaRef); ea.sendEvent(new Event("jersey/test/DEPLOYED", new HashMap<String, String>() { { put("context-path", "/"); } })); bc.ungetService(eaRef); } } private void unregisterServlets() { if (this.httpService != null) { logger.info("JERSEY BUNDLE: UNREGISTERING SERVLETS"); httpService.unregister(CONTEXT_PATH); logger.info("JERSEY BUNDLE: SERVLETS UNREGISTERED"); } } private Dictionary<String, String> getJerseyServletParams() { Dictionary<String, String> jerseyServletParams = new Hashtable<>(); jerseyServletParams.put("javax.ws.rs.Application", RestApplication.class.getName()); logger.info("kira2will" + RestApplication.class.getName()); return jerseyServletParams; } }

StatusService.java

package helloworldosgi;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import data.Node;

@Path("/status")
public class StatusService {

    private static final Logger logger = Logger.getLogger(StatusService.class.getName());
    
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Node getStatus(){
        
        List<Node> nodes = new ArrayList<Node>();
        Node node = new Node("001", "60800","192.168.1.1","0","92","92","chizhou","50ms","hw");
        Node nothingNode = new Node("null","null","null","null","null","null","null","null","null");
        //nodes.add(node);
        nodes.add(node);
        logger.info(node.getName());
        return node;
    }
    
    @Path("/{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Node getID(@PathParam("id") int id){        
        List<Node> nodes = new ArrayList<Node>();
    
        nodes.add(new Node("null","null","null","null","null","null","null","null","null"));
        nodes.add(new Node("001", "60600","192.168.1.1","0","92","92","tonglin","50ms","hw"));
        nodes.add(new Node("002", "60600","192.168.1.1","0","92","92","tonglin","50ms","hw"));
        nodes.add(new Node("003", "60600","192.168.1.1","0","92","92","tonglin","50ms","hw"));
        nodes.add(new Node("004", "60600","192.168.1.1","0","92","92","tonglin","50ms","hw"));
        nodes.add(new Node("005", "60600","192.168.1.1","0","92","92","tonglin","50ms","hw"));        
        
        int defaultIndex = 0;
        if ( (id < 1) || (id > nodes.size() - 1) ){
            logger.info(nodes.get(defaultIndex).getId());
            return nodes.get(defaultIndex);
        }
        else{
            logger.info(nodes.get(id).getId());
            return nodes.get(id);
        }        
    }
}

RestApplication.java

package helloworldosgi;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

public class RestApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> result = new HashSet<Class<?>>();

        result.add(JacksonJsonProvider.class);

        result.add(StatusService.class);

        return result;
    }
}

Node.java

package data;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Node {
    
    private String id;
    private String name;
    private String admin_ip;
    private String admin_status;
    private String longitude;
    private String latitude;
    private String location;
    private String latency;
    private String vendor_name;
    
    public Node(String id,
                String name,
                String admin_ip,
                String admin_status,
                String longitude,
                String latitude,
                String location,
                String latency,
                String vendor_name
                ){
        this.id = id;
        this.name = name;
        this.admin_ip = admin_ip;
        this.admin_status = admin_status;
        this.longitude = longitude;
        this.latitude = latitude;
        this.location = location;
        this.latency = latency;
        this.vendor_name = vendor_name;
    }
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAdmin_ip() {
        return admin_ip;
    }

    public void setAdmin_ip(String admin_ip) {
        this.admin_ip = admin_ip;
    }

    public String getAdmin_status() {
        return admin_status;
    }

    public void setAdmin_status(String admin_status) {
        this.admin_status = admin_status;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getLatency() {
        return latency;
    }

    public void setLatency(String latency) {
        this.latency = latency;
    }

    public String getVendor_name() {
        return vendor_name;
    }

    public void setVendor_name(String vendor_name) {
        this.vendor_name = vendor_name;
    }    
}

4.瀏覽器中輸入 http://localhost:8080/rest/json/status 即可訪問public Node getStatus() 返回值。

或者輸入 http://localhost:8080/rest/json/status/2 即可訪問public Node getID(@PathParam("id") int id)返回值。

關於@Path @Get @PathParam 參考 http://www.docin.com/p-317614298.html 第七頁。

http://download.csdn.net/detail/kira_will/9729055

原文地址:https://www.cnblogs.com/kira2will/p/5040264.html

Equinox OSGi應用嵌入Jersey框架搭建REST服務