原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务
一、环境
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
原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务的更多相关文章
- Equinox OSGi应用嵌入Jersey框架搭建REST服务
原文地址:https://www.cnblogs.com/kira2will/p/5040264.html 一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Eq ...
- go服务端----使用dotweb框架搭建简易服务
使用dotweb框架搭建简易服务 go语言web框架挺多的,所谓琳琅满目,里面也有很多优秀的,比如echo.beego等,但体验下来,总是觉得哪里有点小疙瘩,后来才明白过来,echo太简单,很多日常使 ...
- 使用Yii2的Web框架搭建微服务框架
方法 使用自己的Yii2镜像作为基础 使用Yii2的Web框架搭建,为了节省搭建Yii2框架的时间,直接使用现有的Yii2项目,删除了业务相关的逻辑类,将这个代码库作为搭建微服务框架的基础,本身已经积 ...
- Flask框架搭建REST-API服务
一.目的 为了能够将测试工具部署成RESTful-API服务,这样就能通过接口的方式提供统一测试工具服务,使用人员就不用构建application而产生的各种环境问题.使用问题. 适合人群:Pytho ...
- django框架搭建web服务
一.工具 环境:windows 7 python 2.7.7 下载地址:https://www.python.org/downloads/release/python-2713/ ps:这 ...
- [Visual Studio] SOA服务框架搭建
1.服务框架搭建 2.服务模板创建 3.Nuget引用 4.客户端调用 任务点: 1.分析SOA 2.修改SOA架构名称以及关键字 3.使用Nuget添加引用 4.选择服务模板进行创建 5.尝试调用 ...
- [原创]基于VueJs的前后端分离框架搭建之完全攻略
首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...
- 一步一步使用ABP框架搭建正式项目系列教程之本地化详解
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...
- Jersey 2 + Maven + Tomcat + IntelliJ IDEA 搭建RESTful服务
本文参考以下内容: [1] Starting out with Jersey & Apache Tomcat using IntelliJ [2] [Jersey]IntelliJ IDEA ...
随机推荐
- was not declared in this scope
“was not declared in this scope”是一个错误信息,在编译的时候会遇到.其含义为标识符在其出现的地方是未被定义的. 出现该错误的时候,会同时把未定义的变量名显示出来.比如如 ...
- javascript中通过匿名函数进行事件绑定
- Java被忽略的基本知识(四)
Java IO(不是一般的重要) 54.IO中的流:字节流(InputStream.OutputStream).字符流(Reader.Writer).转换流(InputStreamReader.Out ...
- iOS 开发:TCP三次握手连接
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...
- android 命令编译
引用:http://jojol-zhou.iteye.com/blog/729254 Android 命令行手动编译打包过程图 [详细步骤]: 1使用aapt生成R.java类文件: 例: F:\e ...
- 编写ros串口节点,使用官方serial包
参考http://www.roswiki.com/read.php?tid=557&fid=39 1.通过sudo apt-get install ros-<distro>-ser ...
- javascript的escape()方法
escape() 方法:采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码 ...
- Git远程操作详解
Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...
- CSS、HTML5、JS
[att*=value]{}包含value属性的所有元素样式.[id*=div]{} a[href$=jpg]:after{} [att^=value]{}开头字符包含value属性的所有元素样式 [ ...
- Android 开发命令行完全攻略
作为命令行的爱好者,我想写这个主题已经有好一段时间了.除了显得很酷之外,命令行的使用能够提高我们的开发效率,因为相比通过鼠标点击一系列的菜单选项,使用键盘输入几个字符并点击 TAB 健显然会快很多. ...