用于 RESTful Web 服务的 Spring Boot 与 Apache CXF?

Posted

技术标签:

【中文标题】用于 RESTful Web 服务的 Spring Boot 与 Apache CXF?【英文标题】:Spring Boot vs. Apache CXF for RESTful Web Services? 【发布时间】:2014-09-24 19:45:37 【问题描述】:

我是编码竞赛的一员,任务是创建一个 RESTful 在线市场,用户可以在其中通过 http 发布买卖请求。

我需要构建一个接受并存储这些请求的前端 Web 服务。

技术要求包括 Spring Boot 和 CXF。据我所知,CXF 和 Spring boot 都能够接受 http 请求。

在 Spring Boot 中,您使用如下控制器:

@Controller
@EnableAutoConfiguration
public class controller 

    @RequestMapping("/")
    @ResponseBody
    String home() 
        return "Hello, World!";
    

而对于 CXF(使用 javax.ws.rs),代码可能如下所示:

@WebService(serviceName = "MarketService", targetNamespace = "http://localhost:9005")
@Consumes( MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON )
public interface MarketService 

    @GET
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces( MediaType.APPLICATION_JSON )
    @Path("/sells/id")
    public prod getProduct(@PathParam("id") int id);

有人可以帮我理解这两种处理 http 请求的方法之间的根本区别吗?有没有办法在同一个应用程序中同时使用 Spring Boot 和 CXF?

【问题讨论】:

spring 示例真的不是 spring boot……它看起来更像 spring-mvc。您可能正在使用 spring-boot 来启动并运行您的应用程序......但您使用的代码是 spring-mvc 的东西。 【参考方案1】:

通过添加以下内容来使用 Spring Boot CXF JAX-RS 启动器:

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
  <version>3.1.7</version>
</dependency>

另请参阅:http://cxf.apache.org/docs/springboot.html

【讨论】:

【参考方案2】:

Spring MVC 和 Apache CXF 是处理 HTTP 请求的 2 个独立框架,可用于构建 REST Web 服务。

Spring MVC 是 Spring“保护伞”下的一个项目(因此与构建它的 Spring 框架紧密相关), Apache CXF 是 JAX-RS (REST) 和 JAX-WS (SOAP) 的开源实现。 Apache CXF 可以独立运行,也可以包含在 Spring 应用程序中。

如果您希望构建 REST Web 服务,它们几乎是互斥的(您必须选择一个)。如果您要做的只是构建 REST Web 服务,那么它们几乎是等价的。如果您还需要一个 MVC 框架来服务 HTML 页面,那么 Spring MVC 具有该功能(CXF 没有)。

个人意见:Spring MVC 比 CXF(需要更多 XML 配置)更容易上手(感谢 Spring Boot 为您处理大部分配置)。

PS:在您的 CXF 示例中,您有一个 @WebService 注释。此注释是 JAX-WS (SOAP) 的一部分,而不是 JAX-RS (REST)。你可能不需要它。

【讨论】:

这里的通知中的一点评论;使用 REST WS 然后 REST Web 服务真的让我感到困惑,认为这些肯定是不同的东西(也许它们是??)。可能需要稍作修改以使其更清晰。【参考方案3】:

查看此项目,了解如何通过 TomEE 在 Tomcat 上利用 CXF 的 JAX-RS (REST) 入门。

一切都已准备就绪。

https://github.com/tomitribe/tomee-jaxrs-starter-project

详细说明:

http://www.tomitribe.com/blog/2014/06/apache-tomee-jax-rs-and-arquillian-starter-project

注意,运行 CXF "Standalone" 仍然需要一个 Servlet 容器(Tomcat 或 Jetty),所以以上是在一个小型启动项目中完成、简化和完成的几个步骤。专为不喜欢看方向而只想开始黑客攻击的不耐烦的人(比如我自己)设计。我总是更容易从可行的东西开始,然后对其进行调整。

【讨论】:

以上是关于用于 RESTful Web 服务的 Spring Boot 与 Apache CXF?的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud 构建一个restful的web服务

Spring Boot 构建一个RESTful Web服务

如何使用 Spring RESTful Web 服务处理 CSRF 保护?

[译]Spring Boot 构建一个RESTful Web服务

Spring Webflux 构建响应式 Restful Web 服务

Spring Webflux 构建响应式 Restful Web 服务