这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器:它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是,嵌入最新的Apache Tomcat 7非常容易,因此现在让我展示一下。 我不会重复完整的上一篇文章 ,因为除了POM文件Starter类之外没有任何更改。 除了这两个之外,我们正在重用以前所做的一切。 对于POM文件,我们需要删除Jetty依赖性并将其替换为Apache Tomcat 。 第一个更改将在properties部分中,我们将用org.apache.tomcat替换org.eclipse.jetty.version

所以这行:

<org.eclipse.jetty.version>8.1.8.v20121106</org.eclipse.jetty.version>

变成:

<org.apache.tomcat>7.0.34</org.apache.tomcat>

第二个更改是依赖关系本身,我们将替换以下行:

<dependency><groupid>org.eclipse.jetty</groupid><artifactid>jetty-server</artifactid><version>${org.eclipse.jetty.version}</version>
</dependency><dependency><groupid>org.eclipse.jetty</groupid><artifactid>jetty-webapp</artifactid><version>${org.eclipse.jetty.version</version>
</dependency>

这些:

<dependency><groupid>org.apache.tomcat.embed</groupid><artifactid>tomcat-embed-core</artifactid><version>${org.apache.tomcat}</version>
</dependency><dependency><groupid>org.apache.tomcat.embed</groupid><artifactid>tomcat-embed-logging-juli</artifactid><version>${org.apache.tomcat}</version>
</dependency>

太好了,这部分完成了。 最后一部分专门讨论主类实现中的更改,我们将用Apache Tomcat替换Jetty 。

package com.example;import java.io.File;
import java.io.IOException;import org.apache.catalina.Context;
import org.apache.catalina.loader.WebappLoader;
import org.apache.catalina.startup.Tomcat;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;import com.example.config.AppConfig;public class Starter { private final static Log log = LogFactory.getLog( Starter.class );public static void main(final String[] args) throws Exception {final File base = createBaseDirectory();log.info( "Using base folder: " + base.getAbsolutePath() );final Tomcat tomcat = new Tomcat();tomcat.setPort( 8080 );tomcat.setBaseDir( base.getAbsolutePath() ); Context context = tomcat.addContext( "/", base.getAbsolutePath() );Tomcat.addServlet( context, "CXFServlet", new CXFServlet() );context.addServletMapping( "/rest/*", "CXFServlet" );context.addApplicationListener( ContextLoaderListener.class.getName() );context.setLoader( new WebappLoader( Thread.currentThread().getContextClassLoader() ) );context.addParameter( "contextClass", AnnotationConfigWebApplicationContext.class.getName() );context.addParameter( "contextConfigLocation", AppConfig.class.getName() );tomcat.start();tomcat.getServer().await();}private static File createBaseDirectory() throws IOException {final File base = File.createTempFile( "tmp-", "" );if( !base.delete() ) {throw new IOException( "Cannot (re)create base folder: " + base.getAbsolutePath()  );}if( !base.mkdir() ) {throw new IOException( "Cannot create base folder: " + base.getAbsolutePath()  );         }return base;}
}

该代码看起来非常简单但冗长,因为在没有指定某些工作目录的情况下似乎不可能以嵌入式模式运行Apache Tomcat 。 小小的createBaseDirectory()函数创建一个临时文件夹,我们将其作为baseDir馈入Apache Tomcat 。 实现表明,我们正在端口8080上运行Apache Tomcat服务器实例,我们正在配置Apache CXF servlet来处理/ rest / *路径上的所有请求,我们将添加Spring上下文侦听器,最后将服务器启动。

将项目构建为一个胖子或一个罐子之后 ,我们将拥有一个功能完善的服务器来托管我们的JAR-RS应用程序:

mvn clean package
java -jar target/spring-one-jar-0.0.1-SNAPSHOT.one-jar.jar

我们应该看到这样的输出:

Jan 28, 2013 5:54:56 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ['http-bio-8080']
Jan 28, 2013 5:54:56 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Jan 28, 2013 5:54:56 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.34
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_0.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_1.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_2.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_1.dtd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_2_0.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_2_1.xsd
Jan 28, 2013 5:54:57 PM org.apache.catalina.loader.WebappLoader setClassPath
INFO: Unknown loader com.simontuffs.onejar.JarClassLoader@187a84e4 class com.simontuffs.onejar.JarClassLoader
Jan 28, 2013 5:54:57 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Jan 28, 2013 5:54:57 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Jan 28, 2013 5:54:58 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Mon Jan 28 17:54:58 EST 2013]; root of context hierarchy
Jan 28, 2013 5:54:58 PM org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider registerDefaultFilters
INFO: JSR-330 'javax.inject.Named' annotation found and supported for component scanning
Jan 28, 2013 5:54:58 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext loadBeanDefinitions
INFO: Successfully resolved class for [com.example.config.AppConfig]
Jan 28, 2013 5:54:58 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Jan 28, 2013 5:54:58 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@62770d2e: defining beans [org.springframework.context.annotation.internal
ConfigurationAnnotationProcessor,org.springframework.context.annotation.
internalAutowiredAnnotationProcessor,org.springframework.context.annotation.
internalRequiredAnnotationProces
sor,org.springframework.context.annotation.internalCommonAnnotationProcessor,
appConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.
importAwareProcessor,
cxf,jaxRsServer,jaxRsApiApplication,peopleRestService,peopleService,jsonProvider]; root of factory hierarchy
Jan 28, 2013 5:54:59 PM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be /api
Jan 28, 2013 5:54:59 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 1747 ms
Jan 28, 2013 5:54:59 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ['http-bio-8080']

让我们发出一些HTTP请求,以确保一切正常。

> curl http://localhost:8080/rest/api/people?page=2
[{'email':'person+6@at.com','firstName':null,'lastName':null},{'email':'person+7@at.com','firstName':null,'lastName':null},{'email':'person+8@at.com','firstName':null,'lastName':null}, {'email':'person+9@at.com','firstName':null,'lastName':null}, {'email':'person+10@at.com','firstName':null,'lastName':null}
]> curl http://localhost:8080/rest/api/people -X PUT -d 'email=a@b.com'
{'email':'a@b.com','firstName':null,'lastName':null}

而且我们仍然100%免费提供XML ! 不过,有一个重要的注意事项 :我们每次都会创建一个临时文件夹,但永远不会删除它(对base调用deleteOnShutdown不能像预期的那样对非空文件夹起作用)。 当我决定保持代码整洁时,请记住这一点(例如,添加您自己的关闭挂钩)。

参考: http //aredko.blogspot.gr/2013/01/going-rest-embedding-tomcat-with-spring.html(来自Andriy Redko {devmind}博客上的JCG合作伙伴 Andrey Redko)。

翻译自: https://www.javacodegeeks.com/2013/02/going-rest-embedding-tomcat-with-spring-and-jax-rs-apache-cxf.html

走向REST:将Tomcat与Spring和JAX-RS嵌入(Apache CXF)相关推荐

  1. 基于Spring Boot应用Apache CXF发布Web Services服务

    记录:298 场景:使用Spring Boot应用Apache CXF发布Web Services服务,实现跨系统之间交互接口. 版本: JDK 1.8 Spring Boot 2.6.3 Apach ...

  2. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)

    jax-ws cxf 这篇文章是上一篇文章的逻辑延续. 唯一的区别是我们将使用的容器:它将是我们的老兄Apache Tomcat而不是Jetty . 令人惊讶的是,嵌入最新的Apache Tomcat ...

  3. 使用Apache cxf 和Spring在Tomcat下发布Webservice指南

    转载 http://blog.csdn.net/zhangzhaokun/article/details/4750021 最近学习了如何使用apache cxf和Spring发布webservice, ...

  4. Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service...

    起步 参照这一系列的另外一篇文章: Apache CXF实现Web Service(2)--不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 首先 ...

  5. jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    jax-ws cxf 对于服务器核心Java开发人员来说,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. ...

  6. 走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    对于服务器核心Java开发人员而言,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. 但是,我们不会使用涉 ...

  7. 【webservice】spring整合webservice RS风格

    [webservice]spring整合webservice RS风格 UserService package cn.zxl.cxf.service;import java.util.List;imp ...

  8. jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

    jetty嵌入式容器 最近,我遇到了一个非常有趣的问题,我认为这只需要几分钟就可以解决:在Linux中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF (当前版 ...

  9. Apache CXF 3.0:CDI 1.1支持替代Spring

    几周前刚刚发布了Apache CXF 3.0 ,该项目又迈出了满足JAX-RS 2.0规范要求的又一个重要步骤:与CDI 1.1集成. 在此博客文章中,我们将看几个有关Apache CXF 3.0和A ...

最新文章

  1. java017.Set集合
  2. mysql之DDL操作--数据库
  3. A组包含的前导码数( sizeOfRA-PreamblesGroupA)
  4. 成功解决D8016“/ZI”和“/Gy-”命令行选项不兼容
  5. boost::transpose_graph用法的测试程序
  6. 【老王来了】之隔壁路由器坏了,他来了...
  7. 学院-读书:影响世界的100本书
  8. Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
  9. 小程序服务器搭建前后端交互,微信小程序:request前后端交互 路由跳转 存储数据到本地和获取 小程序登入 授权...
  10. 【Elasticsearch】Elasticsearch之别名
  11. apicloud 请删除手机中的apploader后在尝试
  12. Iris数据集免费下载
  13. php网上花店管理系统的论文,网上花店管理系统
  14. 文件比较软件修改比较文件时间戳方法
  15. 【软件工程】根据数据流图导出程序结构
  16. 舵机的基本了解以及数字舵机和模拟舵机的区别
  17. 性能测试实战(二):性能测试基础
  18. iOS 视频录制流程解析
  19. 三菱PLC控制步进驱动器脉冲定位相关(附代码接线图)
  20. 蚂蚁特工吱指南|用来吃的AR游戏机,奥利奥终于对自己下手了

热门文章

  1. 为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...
  2. jvm(12)-java内存模型与线程
  3. serv-u 数据备份_如何使用用户数据脚本在EC2实例上安装Apache Web Server
  4. caffeine 缓存_使用Caffeine和Spring Boot的多个缓存配置
  5. java附加属性_Java 9附加流
  6. 字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...
  7. Java中的复合设计模式
  8. 使用Angular,Ionic 4和Spring Boot构建移动应用
  9. spring boot程序_Spring Boot –现代Java应用程序的基础
  10. memento模式_Java中的Memento设计模式-示例教程