jax-rs jax-ws_极端懒惰:使用Spring Boot开发JAX-RS服务

jax-rs jax-ws

我认为可以公平地说,作为软件开发人员,我们一直在寻找编写更少的代码的方法,这些代码可以自动地或不能自动地完成更多的工作。 考虑到这一点,作为Spring产品组合的骄傲成员的Spring Boot项目中断了传统方法,极大地加快了并简化了基于Spring的应用程序的开发。

关于Spring Boot ,还有很多要说的东西 ,关于它如何工作以及如何与大多数(即使不是全部) Spring项目进行无缝集成的内在细节。 但是它的功能远不止于此,它支持与流行的Java框架进行一流的集成。

在本文中,我们将探讨如何将Spring BootApache CXF项目结合使用,以进行快速的REST(ful)Web服务开发。 我们很快就会看到, Spring Boot会处理很多样板,让我们专注于应用程序中具有真正价值的部分。 希望在本文结尾处,为您的项目采用Spring Boot的好处显而易见。

这样,我们就可以开始开发一个简单的人员管理REST(ful)Web服务 ,并将其包装到熟悉的PeopleRestService JAX-RS资源中:

@Path("/people")
@Component
public class PeopleRestService {
    @GET
    @Produces({MediaType.APPLICATION_JSON})
    public Collection<Person> getPeople() {
        return Collections.singletonList(new Person("a@b.com", "John", "Smith"));
    }
}

此处添加的内容不多,是非常简单的实现,它返回人员的硬编码集合。 我们可以通过多种方式打包和部署此JAX-RS服务,但可以说最简单的方法是将其托管在嵌入式servlet容器(例如TomcatJettyUndertow)中 。 随之而来的是例程:容器初始化,配置Spring上下文位置,注册侦听器,……让我们看看Spring Boot如何通过剖析下面的Spring上下文配置来提供帮助。

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = PeopleRestService.class)
public class AppConfig {
    @Autowired private PeopleRestService peopleRestService;
 
    @Bean(destroyMethod = "shutdown")
    public SpringBus cxf() {
        return new SpringBus();
    }

    @Bean(destroyMethod = "destroy") @DependsOn("cxf")
    public Server jaxRsServer() {
        final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();

        factory.setServiceBean(peopleRestService);
        factory.setProvider(new JacksonJsonProvider());
        factory.setBus(cxf());
        factory.setAddress("/");

        return factory.create();
    }

    @Bean
    public ServletRegistrationBean cxfServlet() {
        final ServletRegistrationBean servletRegistrationBean = 
            new ServletRegistrationBean(new CXFServlet(), "/api/*");
        servletRegistrationBean.setLoadOnStartup(1);
        return servletRegistrationBean;
    }
}

AppConfig类看起来像一个典型的基于Spring Java的配置,除了此异常的@EnableAutoConfiguration批注,毫无疑问 ,它来自Spring Boot模块。 在幕后,使用此注释可以进行复杂且智能的猜测,尤其是猜测我们将要运行哪种应用程序以及我们的应用程序可能需要哪种Spring bean。 有了此配置后,我们只需要为我们的应用程序提供一个运行器,同时也要具有一些Spring Boot风格:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(AppConfig.class, args);
    }
}

有了@SpringBootApplication元注释,并使用SpringApplication初始化我们的Spring上下文,我们有了一个成熟的可运行Java应用程序,可以使用Spring Boot插件Apache Maven运行该应用程序:

mvn spring-boot:run

或打包为单个可运行的uber- JAR并从命令行调用:

mvn package
java -jar target/jax-rs-2.0-cxf-spring-boot-0.0.1-SNAPSHOT.jar

就是这样,仅需几个注释以及一行代码( main方法)。 一旦运行了应用程序,我们就可以确保我们的人员管理REST(ful)Web服务已正确部署并可以正常运行:

$ curl -i http://localhost:8080/api/people

HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Server: Jetty(9.3.8.v20160314)

[{"email":"a@b.com","firstName":"John","lastName":"Smith"}]

在这一点上,您可能想知道它是如何工作的? 我们没有在任何地方处理servlet容器,所以Jetty如何满足我们的请求? 事实是,我们仅需要包含我们选择的容器作为依赖项,例如使用Apache Mavenpom.xml文件:

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.3.8.v20160314</version>
</dependency>

Spring Boot@ EnableAutoConfiguration / @ SpringBootApplication一起完成其余工作:它检测到类路径中是否存在Jetty ,得出一个有效的结论,即我们的意图是运行Web应用程序并用必要的内容补充Spring上下文。 不只是辉煌吗?

如果不涵盖Spring Boot项目的另一个重要功能,那就是不公平的完成:集成测试支持。 在这方面, Spring Boot采用相同的方法,并提供了一些注释,以消除所有我们不得不另外编写的脚手架。 例如:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = AppConfig.class)
@WebIntegrationTest(randomPort = true)
public class PeopleRestServiceIntegrationTest {
    @Value("${local.server.port}") private int port;
 
    @Before
    public void setUp() {
        RestAssured.port = port;
    }
 
    @Test
    public void testListOfPersonsIsBeingReturnedSuccessfuly() {
        given()
            .when() 
            .contentType(ContentType.JSON)
            .get("/api/people")
            .then()
            .statusCode(200)
            .log()
            .ifValidationFails();
    }
}

@SpringApplicationConfiguration (请注意我们在测试中使用的配置与主应用程序相同)和@WebIntegrationTest这两个注解,它们将Web应用程序测试的细节考虑在内并在随机端口上运行嵌入式Servlet容器,并且我们已经针对人员管理JAX-RS服务进行了全面的集成测试。 可通过local.server.port环境属性获得运行servlet容器的端口,因此我们可以在测试背景中配置REST保证的端口。 简单容易。

在本文中,我们仅研究了使用Spring Boot来提高JAX-RS项目的开发速度的一种特定用例。 Spring Boot带来了许多琐碎的事情,每个发行版中都添加了越来越多的智能,更不用说与所选IDE的出色集成。 我希望您真的对Spring Boot感到兴奋,并渴望了解更多有关Spring Boot的信息。 值得花费时间和精力。

完整的项目可以在Github上找到

翻译自: https://www.javacodegeeks.com/2016/05/laziness-extreme-developing-jax-rs-services-spring-boot.html

jax-rs jax-ws

去几年,REST逐渐成为影响Web框架、Web协议与Web应用设计的重要概念。如果你还不了解REST,那这个简短的介绍将有助你快速掌握REST,此外还可以点击这里了解关于REST的更多信息。 相关厂商内容 高速下载:Adobe Flash Builder 4 简体中文正式版 for Windows 高速下载:Adobe Flash Builder 4 简体中文正式版 for Mac 利用Flex SDK创建易于访问的Adobe AIR应用程序 Adobe和英特尔联手推新服务帮助开发者发行AIR应用 构建更加完善的Adobe AIR应用程序之十大秘诀 相关赞助商 汇集最新RIA技术相关资源,提供Flash开发平台相关工具高速下载,免费获得Adobe软件的产品序列号。 现在有越来越多的公司希望能以简单而又贴合Web架构本身的方式公开Web API,因此REST变得越来越重要也就不足为奇了。使用Ajax进行通信的富浏览器端也在朝这个目标不断迈进。这个架构原则提升了万维网的可伸缩性,无论何种应用都能从该原则中受益无穷。 JAX-RS(JSR 311)指的是Java API for RESTful Web Services,Roy Fielding也参与了JAX-RS的制订,他在自己的博士论文中定义了REST。对于那些想要构建RESTful Web Services的开发者来说,JAX-RS给出了不同于JAX-WS(JSR-224)的另一种解决方案。目前共有4种JAX-RS实现,所有这些实现都支持Spring,Jersey则是JAX-RS的参考实现,也是本文所用的实现。 如果你使用Spring进行开发,那可能想知道(或者有人曾问过你)Spring MVC与JAX-RS有何异同点?更进一步,如果你手头有一个Spring MVC应用,使用了控制类继承(SimpleFormController等),你可能还意识不到现在的Spring MVC对REST广泛的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值