javascript
jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)
jax-ws cxf
這篇文章是上一篇文章的邏輯延續。 唯一的區別是我們將使用的容器:它將是我們的老兄Apache Tomcat而不是Jetty 。 令人驚訝的是,嵌入最新的Apache Tomcat 7非常容易,因此現在讓我展示一下。 我不會重復完整的上一篇文章 ,因為除了POM文件和Starter類之外沒有任何更改。 除了這兩個之外,我們正在重用以前所做的一切。 對于POM文件,我們需要刪除Jetty依賴性并將其替換為Apache Tomcat 。 第一個更改將在properties部分中,我們將用org.apache.tomcat替換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
jax-ws cxf
總結
以上是生活随笔為你收集整理的jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360电脑专家在哪里(新版360电脑专家
- 下一篇: jax-ws cxf_走向REST:在S