📜  带有JAX-RS的Apache CXF

📅  最后修改于: 2020-10-28 05:35:21             🧑  作者: Mango


在继续本章之前,我们假定您知道如何用Java编写RESTful Web服务。我将向您展示如何在此JAX-RS(用于RESTful Web服务的Java API)之上使用CXF。我们将创建一个维护最新电影列表的Web服务。当用户请求电影时,他在请求中指定了电影ID,服务器将找到该电影并将其返回给客户端。在普通情况下,我们将简单地将影片名称返回给客户端,而不是实际的二进制MP4文件。因此,让我们开始创建JAX-RS应用程序。

声明电影元素

我们将声明一个名为Movie的XML根元素,用于存储给定电影的ID和名称。该元素在名为Movie.java的文件中声明。文件的内容显示在这里-

//Movie.java
package com.tutorialspoint.cxf.jaxrs.movie;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Movie")
public class Movie {
   private long id;
   private String name;
   public long getId() {
      return id;
   }
   public void setId(long id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

请注意,使用XmlRootElement标记来声明Movie标记的XML元素。接下来,我们将创建一个在其数据库中保存电影列表的服务。

创建电影服务数据库

为了存储电影列表,我们使用Java提供的Map ,该Map存储了键值对。如果列表很大,则将使用外部数据库存储,该存储也将更易于管理。在平凡的情况下,我们将仅在数据库中存储五部电影。 MovieService类的代码在下面给出-

//MovieService.java
package com.tutorialspoint.cxf.jaxrs.movie;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/movieservice/")
@Produces("text/xml")
public class MovieService {
   long currentId = 123;
   Map movies = new HashMap<>();
   public MovieService() {
      init();
   }
   @GET
   @Path("/movie/{id}/")
   public Movie getMovie(@PathParam("id") String id) {
      long idNumber = Long.parseLong(id);
      return movies.get(idNumber);
   }
   final void init() {
      Movie c1 = new Movie();
      c1.setName("Aquaman");
      c1.setId(1001);
      movies.put(c1.getId(), c1);
      
      Movie c2 = new Movie();
      c2.setName("Mission Imposssible");
      c2.setId(1002);
      movies.put(c2.getId(), c2);
      
      Movie c3 = new Movie();
      c3.setName("Black Panther");
      c3.setId(1003);
      movies.put(c3.getId(), c3);
      
      Movie c4 = new Movie();
      c4.setName("A Star is Born");
      c4.setId(1004);
      movies.put(c4.getId(), c4);
      
      Movie c5 = new Movie();
      c5.setName("The Meg");
      c5.setId(1005);
      movies.put(c5.getId(), c5);
   }
}

请注意,我们使用以下两个注释来指定电影服务的URL路径及其返回类型-

@Path("/movieservice/")
@Produces("text/xml")

我们使用@GET和@Path批注指定GET请求的URL,如下所示-

@GET
@Path("/movie/{id}/")

电影数据库本身是在init方法中初始化的,在该方法中,我们向数据库中添加了五个电影项目。

我们的下一个任务是编写服务器应用程序。

开发服务器

要创建服务器,我们使用CXF提供的JAXRSServerFactoryBean类。

JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();

我们通过调用setResourceClasses方法设置其资源类。

factory.setResourceClasses(Movie.class);
factory.setResourceClasses(MovieService.class);

我们通过调用setResourceProvider方法来设置服务提供者。

factory.setResourceProvider(MovieService.class,
new SingletonResourceProvider(new MovieService()));

我们通过调用aetAddress方法设置所需的发布地址-

factory.setAddress("http://localhost:9000/");

最后,我们通过在工厂实例上调用create方法来发布服务器。

factory.create();

服务器应用程序的完整代码如下:

//Server.java
package com.tutorialspoint.cxf.jaxrs.movie;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
public class Server {
   public static void main(String[] args) throws Exception {
      JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
      factory.setResourceClasses(Movie.class);
      factory.setResourceClasses(MovieService.class);  
      factory.setResourceProvider(MovieService.class,
         new SingletonResourceProvider(new MovieService()));
      factory.setAddress("http://localhost:9000/");
      factory.create();
      
      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

最终的pom.xml

这里我们在下面包括了pom.xml的最终版本-



   4.0.0
   com.tutorialspoint
   cxf-jaxrs
   1.0
   jar
   
      UTF-8
      1.8
      1.8
   
   
      
         server
         
            test
            
               
                  org.codehaus.mojo
                  exec-maven-plugin
                  1.6.0
                  
                     
                        test
                        
                           java
                        
                        
                           
                              com.tutorialspoint.cxf.jaxrs.movie.Server
                           
                        
                     
                  
               
            
         
         
            
               org.apache.cxf
               cxf-rt-transports-http-jetty
               3.3.0
            
         
      
      
         client
         
            test
            
               
                  org.codehaus.mojo
                  exec-maven-plugin
                  
                     
                        test
                        
                           java
                        
                        
                           
                              com.tutorialspoint.cxf.jaxrs.movie.Client
                           
                        
                     
                  
               
            
         
      
   
   
      
         org.apache.cxf
         cxf-rt-transports-http
         3.3.0
      
      
         org.apache.cxf
         cxf-rt-transports-http-jetty
         3.3.0
      
      
         org.apache.cxf
         cxf-rt-frontend-jaxrs
         3.3.0
         
      
         jakarta.ws.rs
         jakarta.ws.rs-api
         2.1.5
      
      
         org.apache.httpcomponents
         httpclient
         4.5.7
      
   

发展中的客户

编写RS客户端很简单。我们只需创建一个URL对象并打开其流。我们使用CXF提供的IOUtils类将输入流的内容复制到本地流。

URL url = new URL("http://localhost:9000/movieservice/movie/1002");
try (InputStream instream = url.openStream();
CachedOutputStream outstream = new CachedOutputStream()) {
   IOUtils.copy(instream, outstream);
}

客户端应用程序的完整代码如下:

//Client.java
package com.tutorialspoint.cxf.jaxrs.movie;
import java.io.InputStream;
import java.net.URL;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
public class Client {
   public static void main(String[] args) throws Exception {
      URL url = new URL("http://localhost:9000/movieservice/movie/1002");
      try (InputStream instream = url.openStream();
      CachedOutputStream outstream = new CachedOutputStream()) {
         IOUtils.copy(instream, outstream);
         String str = outstream.getOut().toString();
         System.out.println(str);
      }
   }
}

测试JAX-RS应用程序

在命令行窗口中使用以下命令运行服务器-

mvn -Pserver

现在,您将在控制台上看到以下消息:

INFO: Setting the server's publish address to be http://localhost:9000

现在,打开浏览器并输入以下URL-

http://localhost:9000/movieservice/movie/1002

您将在浏览器窗口中看到以下内容。

浏览器窗口

您可以使用我们通过在单独的命令行窗口中运行以下命令而开发的Java客户端应用程序来调用该服务。

mvn -Pclient

您将看到以下输出-


1002Mission Imposssible

CXF示例提供了几个示例,说明如何将CXF与JAX-RS一起使用。鼓励有兴趣的读者研究这些样本。