原创: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 ...
随机推荐
- VS2010中汉字拷贝到Word出现乱码问题解决
VS2010中的汉字拷贝到Word时出现乱码,有三种解决方法: 一.粘贴时,选择“仅保留文本”.如图: 二.先拷贝粘贴到记事本文件内,此时会自动过滤格式信息,再从记事本拷贝到Word. 三.使用转换软 ...
- 数据绑定控件之Repeater
引言 前几篇的文章在说AJAX的内容,利用AJAX技术能够开发出高效运行的网站应用程序,不过在进行B/S项目开发时只拥有AJAX技术是远远不够的,踏入到B/S要学的东西会更多,但相较C/S的复杂逻辑结 ...
- java关键字 super 和 this
简单粗暴的说就是: super: 是指父类,想要在子类方法中调用父类的实例变量或方法可以通过super 来访问 this:是指当前类,想要访问当前类的实例变量和方法可以使用this,同时可以省略
- Recover lost Confluence password
confluence重置admin密码 复方法: 1. 运行此sql 找到你的管理员帐户: select u.id, u.user_name, u.active from cwd_user u joi ...
- 谈谈我印象中的JVM不足之处
研究JVM也有一段时间了,其间也发现了它的很多不足之处,在此一一道来,由于本人对JVM的理解有限,如有错误的地方,还请大家指正:本文不介绍名词性术语和概念性知识,如有不了解的地方可Search Goo ...
- Problems with MMM for mysql(译文)
Problems with mmm for mysql posted in MySQL by shlomi 原文:http://code.openark.org/blog/mysql/problems ...
- robots.txt文件没错,为何总提示封禁
大家好,我的robots.txt文件没错,为何百度总提示封禁,哪位高人帮我看看原因,在此谢过. 我的站点www.haokda.com,robots.txt如下: ## robots.txt for P ...
- bootstrap——下拉菜单右对齐
通过向 .dropdown-menu 添加 .pull-right 类来向右对齐下拉菜单. Bootstrap默认情况下,下拉菜单自动沿着父元素的上沿和左侧被定位为 100% 宽度. 为 .dropd ...
- Java数据结构之字符串模式匹配算法---KMP算法2
直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...
- Spring源代码解析
Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.itey ...