SlideShare a Scribd company logo
1 of 58
Download to read offline
Introducing
Spring Auto REST Docs
Florian Benz
@flbenz
@spring_io
#springio17
DR REST DOCS
OR: HOW I LEARNED TO STOP WORRYING
AND LOVE DOCUMENTATION
@spring_io
#springio17
Florian Benz
Software Engineer
@flbenz
@spring_io
#springio17
Scalable Capital
• Europe’s fastest growing Digital Wealth Manager
• Authorized financial institute in Germany and the UK
• From scratch with Spring Boot
• Joined effort with Juraj Misur @juraj_misur
@spring_io
#springio17
Spring Auto REST Docs
Scalable Capital
founded
Dec 2014
Proof of concept
Jul 2015
First article
Nov 2015
@spring_io
#springio17
Spring Auto REST Docs
Open source
&
First release
Dec 2016
DZone article
Jan 2017
Two releases
with fixes and
features
Feb & Mar 2017
@spring_io
#springio17
Our Story
@spring_io
#springio17
Manual Documentation
DocumentationCode
@spring_io
#springio17
A single big document
@spring_io
#springio17
Specification-Driven
Documentation
DocumentationCode
Specification
@spring_io
#springio17
RAML Specification
/weather:
get:
queryParameters:
city:
description: Name of a city in the given country.
responses:
200:
body:
application/json:
schema: |
{ "$schema": "http://json-schema.org/schema",
"type": "object",
"description": "Weather information",
"properties": {
"temperature": { "type": "number" }
}
}
@spring_io
#springio17
Swagger / OpenAPI
@GetMapping("weatherParam")
@ApiOperation("weather")
@ApiImplicitParams({
@ApiImplicitParam(name = "country", value = "Country code", required = true,
dataType = "string", paramType = "query"),
@ApiImplicitParam(name = "city", value = "City", required = true,
dataType = "string", paramType = "query")
})
@ApiResponses({
@ApiResponse(code = 200, message = "Success", response =
WeatherResponse.class)
})
public WeatherResponse weatherParam(@RequestParam @IsoCountryCode String
country,
@RequestParam String city) {
return new WeatherResponse(20);
}
@spring_io
#springio17
Swagger / OpenAPI
@spring_io
#springio17
Postman
@spring_io
#springio17
Test-Driven Documentation
DocumentationCode
Tests
@spring_io
#springio17
Spring REST Docs
Generated
snippets
Tests
Hand-written
documentation
Documentation
@spring_io
#springio17
Spring MVC Test
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
}
@spring_io
#springio17
Spring REST Docs
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
.andDo(document("weather",
requestFields(
fieldWithPath("country").description("Country code"),
fieldWithPath("city").description("City name"))));
}
@spring_io
#springio17
Generated snippet
|===
|Path|Type|Optional|Description
|country
|String
|false
|Country Code.
|city
|false
|true
|City name.
|===
@spring_io
#springio17
AsciiDoc
[[resources-weather]]
= Weather for your city
`POST /weather`
Up-to-date temperature for the given city
== Response structure
include::{snippets}/weather/response-fields.adoc[]
== Example request/response
include::{snippets}/weather/curl-request.adoc[]
include::{snippets}/weather/http-response.adoc[]
@spring_io
#springio17
Spring REST Docs
@spring_io
#springio17
Spring REST Docs
@spring_io
#springio17
Spring REST Docs
Controller
POJO
Response Entity
Jackson
HTTP response Documented
@spring_io
#springio17
Extending
Spring REST Docs
@spring_io
#springio17
Motivation
.andDo(document("weather",
requestFields(
fieldWithPath("country").description("Country code"),
fieldWithPath("city").description("Name of a city"))));
We are lazy
@spring_io
#springio17
Proof of concept
@spring_io
#springio17
Spring Auto REST Docs
Controller
POJO
Response Entity
Jackson
HTTP response
Javadoc
Introspection
@spring_io
#springio17
Spring REST Docs
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
.andDo(document("weather",
requestFields(
fieldWithPath("country").optional().description("Country code"),
fieldWithPath("city").optional().description("City name"))));
}
@spring_io
#springio17
Spring Auto REST Docs
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
.andDo(document("weather"));
}
@spring_io
#springio17
Javadoc
class WeatherRequest {
/**
* Country code.
*/
private String country;
/**
* City name.
*/
private String city;
}
Path Type Optional Description
country String true Country code.
city String true City name.
@spring_io
#springio17
Constraints
class WeatherRequest {
/**
* Country code, e.g. ES, DE, US.
*/
@NotNull
@IsoCountryCode
private String country;
/**
* City name.
*/
@NotBlank
private String city;
}
Path Type Optional Description
country String false Country code.
Must be an ISO country code.
city String false City name.
@spring_io
#springio17
Constraints
package.OneOf.description=Must be one of ${value}
package.IsoCountryCode.description=Must be an ISO country code
ConstraintDesciptions.properties
@spring_io
#springio17
Constraints
class WeatherRequest {
/**
* Country code, e.g. ES, DE, US.
*/
@NotNull
@IsoCountryCode(groups = Iso.class)
@CountryName(groups = Plain.class)
private String country;
}
Path Type Optional Description
country String false Country code.
ISO: Must be an ISO country code.
Plain: Must be a country name.
@spring_io
#springio17
Enums
class WeatherRequest {
/**
* Country code, e.g. ES, DE, US.
*/
@NotNull
private Country country;
/**
* City name.
*/
@NotBlank
private String city;
}
Path Type Optional Description
country String false Country code.
Must be one of [DE, ES, FR, PT, US].
city String false City name.
@spring_io
#springio17
Original: hand-written
2.8. Weather
POST /weather
Up-to-date weather data for cities around the globe.
[[resources-weather]]
= Weather for your city
`POST /weather`
Up-to-date temperature for the given city
@spring_io
#springio17
Extension: Javadoc on method
/**
* Up-to-date weather data for cities around the globe.
*/
@PostMapping("weather")
public WeatherResponse weather(
@RequestBody @Valid WeatherRequest weatherRequest) {
return new WeatherResponse(20);
}
2.8. Weather
POST /weather
Up-to-date weather data for cities around the globe.
@spring_io
#springio17
Original: Path Parameters
.andDo(document("weather",
pathParameters(
parameterWithName("country").description("Country code"),
parameterWithName("city").description("City name"))));
@spring_io
#springio17
Extension: Path Parameters
/**
* Up-to-date weather data for cities around the globe.
*
* @param country Country code.
* @param city City name.
*/
@GetMapping("weather/{country}/{city}")
public WeatherResponse weatherPath(
@PathVariable @IsoCountryCode String country,
@PathVariable String city) {
return new WeatherResponse(20);
}
@spring_io
#springio17
Path Parameters
@spring_io
#springio17
Path Parameters
@spring_io
#springio17
Original: Query Parameters
.andDo(document("weather",
requestParameters(
parameterWithName("country").description("Country code"),
parameterWithName("city").description("City name"))));
@spring_io
#springio17
Extension: Query Parameters
/**
* Up-to-date weather data for cities around the globe.
*
* @param country Country code.
* @param city City name.
*/
@GetMapping("weatherParam")
public WeatherResponse weatherParam(
@RequestParam @IsoCountryCode String country,
@RequestParam String city) {
return new WeatherResponse(20);
}
@spring_io
#springio17
Query Parameters
@spring_io
#springio17
Query Parameters
@spring_io
#springio17
Section Snippet
[[resources-weather]]
=== Weather for your city
`POST /weather`
Up-to-date temperature for the given city
===== Request structure
include::{snippets}/weather/request-fields.adoc[]
===== Response structure
include::{snippets}/weather/response-fields.adoc[]
===== Example request/response
include::{snippets}/weather/curl-request.adoc[]
include::{snippets}/weather/http-response.adoc[]
include::{snippets}/weather/section.adoc[]
Documentation path
Spring MVC Controller
Javadoc
Method name
@spring_io
#springio17
Authorization snippet
@spring_io
#springio17
Content Modifiers
[
1,
2,
3,
4,
5
]
[
1,
2,
3
]
array shortener
@spring_io
#springio17
Content Modifiers
%PDF-1.5
%����
12 0 obj
<<
/Length 3654
/Filter /FlateDecode
>>
<binary>
binary replacement
@spring_io
#springio17
Benefits
Less to write
Code review Maintainability
Happier developers
DRY
Accurate
@spring_io
#springio17
Sounds good!
Issues?
@spring_io
#springio17
Issues
@spring_io
#springio17
Issues
@spring_io
#springio17
Issues
@spring_io
#springio17
It’s an extension
Authorization snippet
Javadoc/introspection snippets
Content modifiers
@spring_io
#springio17
Spring Auto REST Docs
at Scalable Capital
@spring_io
#springio17
Spring Auto REST Docs
at Scalable Capital
@spring_io
#springio17
Thank you
@spring_io
#springio17
Q&A
@flbenz

More Related Content

Similar to Introducing Spring Auto REST Docs - Spring IO 2017

Introducing Spring Auto REST Docs - Spring Community Meetup Munich
Introducing Spring Auto REST Docs - Spring Community Meetup MunichIntroducing Spring Auto REST Docs - Spring Community Meetup Munich
Introducing Spring Auto REST Docs - Spring Community Meetup MunichFlorian Benz
 
Wso2 Scenarios Esb Webinar July 1st
Wso2 Scenarios Esb Webinar July 1stWso2 Scenarios Esb Webinar July 1st
Wso2 Scenarios Esb Webinar July 1stWSO2
 
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...SensorUp
 
Open source report writing tools for IBM i Vienna 2012
Open source report writing tools for IBM i  Vienna 2012Open source report writing tools for IBM i  Vienna 2012
Open source report writing tools for IBM i Vienna 2012COMMON Europe
 
the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013Joshua Long
 
Semantic Web & TYPO3
Semantic Web & TYPO3Semantic Web & TYPO3
Semantic Web & TYPO3André Wuttig
 
Accessing loosely structured data from F# and C#
Accessing loosely structured data from F# and C#Accessing loosely structured data from F# and C#
Accessing loosely structured data from F# and C#Tomas Petricek
 
WELCOME TO OUR PRESENTION.pptx
WELCOME TO OUR PRESENTION.pptxWELCOME TO OUR PRESENTION.pptx
WELCOME TO OUR PRESENTION.pptxEtzzBadsha
 
Server Side Swift - AppBuilders 2017
Server Side Swift - AppBuilders 2017Server Side Swift - AppBuilders 2017
Server Side Swift - AppBuilders 2017Jens Ravens
 
Supersize me
Supersize meSupersize me
Supersize medominion
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8tdc-globalcode
 
Андрей Шумада "Data migration in node.js rest api and mongo db "
Андрей Шумада "Data migration in node.js rest api and mongo db "Андрей Шумада "Data migration in node.js rest api and mongo db "
Андрей Шумада "Data migration in node.js rest api and mongo db "Fwdays
 
Creating a Facebook Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part V - Transcript.pdfCreating a Facebook Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part V - Transcript.pdfShaiAlmog1
 
The never changing face of immutability
The never changing face of immutabilityThe never changing face of immutability
The never changing face of immutabilityChris Howe-Jones
 
Predictive Analytics with Airflow and PySpark
Predictive Analytics with Airflow and PySparkPredictive Analytics with Airflow and PySpark
Predictive Analytics with Airflow and PySparkRussell Jurney
 
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0Thomas Conté
 
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)MongoDB
 
Django tech-talk
Django tech-talkDjango tech-talk
Django tech-talkdtdannen
 

Similar to Introducing Spring Auto REST Docs - Spring IO 2017 (20)

Introducing Spring Auto REST Docs - Spring Community Meetup Munich
Introducing Spring Auto REST Docs - Spring Community Meetup MunichIntroducing Spring Auto REST Docs - Spring Community Meetup Munich
Introducing Spring Auto REST Docs - Spring Community Meetup Munich
 
Wso2 Scenarios Esb Webinar July 1st
Wso2 Scenarios Esb Webinar July 1stWso2 Scenarios Esb Webinar July 1st
Wso2 Scenarios Esb Webinar July 1st
 
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
 
Open source report writing tools for IBM i Vienna 2012
Open source report writing tools for IBM i  Vienna 2012Open source report writing tools for IBM i  Vienna 2012
Open source report writing tools for IBM i Vienna 2012
 
Where is the World is my Open Government Data?
Where is the World is my Open Government Data?Where is the World is my Open Government Data?
Where is the World is my Open Government Data?
 
the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013
 
Semantic Web & TYPO3
Semantic Web & TYPO3Semantic Web & TYPO3
Semantic Web & TYPO3
 
Accessing loosely structured data from F# and C#
Accessing loosely structured data from F# and C#Accessing loosely structured data from F# and C#
Accessing loosely structured data from F# and C#
 
WELCOME TO OUR PRESENTION.pptx
WELCOME TO OUR PRESENTION.pptxWELCOME TO OUR PRESENTION.pptx
WELCOME TO OUR PRESENTION.pptx
 
Server Side Swift - AppBuilders 2017
Server Side Swift - AppBuilders 2017Server Side Swift - AppBuilders 2017
Server Side Swift - AppBuilders 2017
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
Supersize me
Supersize meSupersize me
Supersize me
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
Андрей Шумада "Data migration in node.js rest api and mongo db "
Андрей Шумада "Data migration in node.js rest api and mongo db "Андрей Шумада "Data migration in node.js rest api and mongo db "
Андрей Шумада "Data migration in node.js rest api and mongo db "
 
Creating a Facebook Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part V - Transcript.pdfCreating a Facebook Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part V - Transcript.pdf
 
The never changing face of immutability
The never changing face of immutabilityThe never changing face of immutability
The never changing face of immutability
 
Predictive Analytics with Airflow and PySpark
Predictive Analytics with Airflow and PySparkPredictive Analytics with Airflow and PySpark
Predictive Analytics with Airflow and PySpark
 
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
 
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
 
Django tech-talk
Django tech-talkDjango tech-talk
Django tech-talk
 

Recently uploaded

Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....kzayra69
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 

Recently uploaded (20)

Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 

Introducing Spring Auto REST Docs - Spring IO 2017