javascript
极端懒惰:使用Spring Boot开发JAX-RS服务
我認(rèn)為可以公平地說,作為軟件開發(fā)人員,我們一直在尋找編寫較少代碼的方法,這些方法可以自動(dòng)完成或不能自動(dòng)完成更多工作。 考慮到這一點(diǎn),作為Spring產(chǎn)品組合的驕傲成員的Spring Boot項(xiàng)目破壞了傳統(tǒng)方法,極大地加快了并簡(jiǎn)化了基于Spring的應(yīng)用程序的開發(fā)。
關(guān)于Spring Boot ,還有很多要說的東西 ,關(guān)于它如何工作以及如何與大多數(shù)(即使不是全部) Spring項(xiàng)目無(wú)縫集成的固有細(xì)節(jié)。 但是它的功能遠(yuǎn)不止于此,它支持與流行的Java框架進(jìn)行一流的集成。
在本文中,我們將研究如何將Spring Boot與Apache CXF項(xiàng)目結(jié)合使用,以進(jìn)行快速的REST(ful)Web服務(wù)開發(fā)。 我們很快就會(huì)看到, Spring Boot會(huì)處理很多樣板,讓我們專注于真正有價(jià)值的應(yīng)用程序部分。 希望在本文結(jié)尾處,為您的項(xiàng)目采用Spring Boot的好處顯而易見。
這樣,我們就可以開始開發(fā)一個(gè)簡(jiǎn)單的人員管理REST(ful)Web服務(wù) ,并將其包裝到熟悉的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"));} }此處添加的內(nèi)容不多,是非常簡(jiǎn)單的實(shí)現(xiàn),它返回人員的硬編碼集合。 我們可以通過多種方式打包和部署此JAX-RS服務(wù),但可以說最簡(jiǎn)單的方法是將其托管在嵌入式servlet容器(例如Tomcat , Jetty或Undertow)中 。 隨之而來的是例程:容器初始化,配置Spring上下文位置,注冊(cè)偵聽器,……讓我們看看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();}@Beanpublic ServletRegistrationBean cxfServlet() {final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/api/*");servletRegistrationBean.setLoadOnStartup(1);return servletRegistrationBean;} }AppConfig類看起來像一個(gè)典型的基于Spring Java的配置,除了這個(gè)異常的@EnableAutoConfiguration批注,毫無(wú)疑問 ,它來自Spring Boot模塊。 在幕后,使用此注釋可以進(jìn)行復(fù)雜且智能的猜測(cè),尤其是猜測(cè)我們將要運(yùn)行哪種應(yīng)用程序以及我們的應(yīng)用程序可能需要哪種Spring Bean。 有了此配置后,我們只需要為我們的應(yīng)用程序提供一個(gè)運(yùn)行程序,同時(shí)也要具有一些Spring Boot風(fēng)格:
@SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(AppConfig.class, args);} }有了@SpringBootApplication元注釋,并使用SpringApplication初始化我們的Spring上下文,我們有了一個(gè)成熟的可運(yùn)行Java應(yīng)用程序,可以使用Spring Boot插件從Apache Maven運(yùn)行該應(yīng)用程序:
mvn spring-boot:run或打包為單個(gè)可運(yùn)行的uber- JAR并從命令行調(diào)用:
mvn package java -jar target/jax-rs-2.0-cxf-spring-boot-0.0.1-SNAPSHOT.jar就是這樣,僅需幾個(gè)注釋以及一行代碼( main方法)。 一旦運(yùn)行了應(yīng)用程序,就可以確保我們的人員管理REST(ful)Web服務(wù)已正確部署并且可以正常運(yùn)行:
$ curl -i http://localhost:8080/api/peopleHTTP/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"}]在這一點(diǎn)上,您可能想知道它是如何工作的? 我們沒有在任何地方處理servlet容器,所以Jetty如何滿足我們的請(qǐng)求? 事實(shí)是,我們只需要包含選擇的容器作為依賴項(xiàng)即可,例如使用Apache Maven的pom.xml文件:
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.3.8.v20160314</version> </dependency>Spring Boot與@ EnableAutoConfiguration / @ SpringBootApplication一起完成其余工作:它檢測(cè)到類路徑中是否存在Jetty ,得出一個(gè)有效的結(jié)論,即我們的意圖是運(yùn)行Web應(yīng)用程序并用必要的內(nèi)容補(bǔ)充Spring上下文。 這不只是輝煌嗎?
如果不涵蓋Spring Boot項(xiàng)目的另一個(gè)重要功能,那就是不公平的完成:集成測(cè)試支持。 在這方面, Spring Boot采用相同的方法,并提供了一些注釋,以消除所有我們不得不另外編寫的腳手架。 例如:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = AppConfig.class) @WebIntegrationTest(randomPort = true) public class PeopleRestServiceIntegrationTest {@Value("${local.server.port}") private int port;@Beforepublic void setUp() {RestAssured.port = port;}@Testpublic void testListOfPersonsIsBeingReturnedSuccessfuly() {given().when() .contentType(ContentType.JSON).get("/api/people").then().statusCode(200).log().ifValidationFails();} }@SpringApplicationConfiguration (請(qǐng)注意,我們?cè)跍y(cè)試中使用的配置與主應(yīng)用程序相同)和@WebIntegrationTest這兩個(gè)注解,它們將Web應(yīng)用程序測(cè)試的細(xì)節(jié)考慮在內(nèi)并在隨機(jī)端口上運(yùn)行嵌入式servlet容器,并且我們已經(jīng)針對(duì)人員管理JAX-RS服務(wù)進(jìn)行了全面的集成測(cè)試。 可通過local.server.port環(huán)境屬性獲得運(yùn)行servlet容器的端口,因此我們可以在測(cè)試背景中配置REST保證的端口。 簡(jiǎn)單容易。
在本文中,我們僅研究了使用Spring Boot來提高JAX-RS項(xiàng)目的開發(fā)速度的一種特定用例。 Spring Boot帶來了許多瑣碎的事情,每個(gè)發(fā)行版中都添加了越來越多的智能,更不用說與所選IDE的出色集成。 我希望您真的對(duì)Spring Boot感到興奮,并渴望了解更多有關(guān)Spring Boot的信息。 值得花費(fèi)時(shí)間和精力。
完整的項(xiàng)目可以在Github上找到 。
翻譯自: https://www.javacodegeeks.com/2016/05/laziness-extreme-developing-jax-rs-services-spring-boot.html
總結(jié)
以上是生活随笔為你收集整理的极端懒惰:使用Spring Boot开发JAX-RS服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程调用 quartz_如何远程管理Qu
- 下一篇: gradle idea java ssm