Spring Boot Demo Project
Take a look at a Spring Boot-based REST API leveraging Result objects
This demo project demonstrates how to handle and serialize Result objects within a Spring Boot application. It provides a working example of a "pet store" web service that exposes a REST API for managing pets.
Generating the Project
The project was generated via Spring Initializr including features: web and cloud-feign.
Adding Serialization Support
Then Jackson datatype module for Result objects was manually added as a dependency to serialize and deserialize Result objects.
dependencies {
// ...
implementation platform('com.leakyabstractions:result-bom:1.0.0.0')
implementation 'com.leakyabstractions:result'
implementation 'com.leakyabstractions:result-jackson'
}We use a @Bean to register the datatype module.
@Configuration
public class JacksonConfig {
@Bean
public Module registerResultModule() {
return new ResultModule();
}
}API Responses
API responses contain a Result field, encapsulating the outcome of the requested operation.
public class ApiResponse<S> {
@JsonProperty String version;
@JsonProperty Instant generatedOn;
@JsonProperty Result<S, ApiError> result;
}Results have different success types, depending on the specific endpoint. Failures will be encapsulated as instances of ApiError.
Controllers
Controllers return instances of ApiResponse that will be serialized to JSON by Spring Boot.
@RestController
public class PetController {
// ...
@GetMapping("/pet")
ApiResponse<Collection<Pet>> list(@RequestHeader("X-Type") RepositoryType type) {
log.info("List all pets in {} pet store", type);
return response(locate(type)
.flatMapSuccess(PetRepository::listPets)
.ifSuccess(x -> log.info("Listed {} pet(s) in {}", x.size(), type))
.ifFailure(this::logError));
}
}Since failures are expressed as ApiError objects, endpoints invariably return HTTP status 200.
Running the Application
The application can be built and run with Gradle.
./gradlew bootRunThis will start a stand-alone server on port 8080.
Testing the Server
Once started, you can interact with the API.
curl -s -H 'x-type: local' http://localhost:8080/pet/0You should see a JSON response like this:
{
"version": "1.0",
"result": {
"success":{
"id": 0,
"name": "Rocky",
"status": "AVAILABLE"
}
}
}Using Swagger-UI
You can navigate to http://localhost:8080/ to inspect the API using an interactive UI

The full source code for the example application is available on GitHub.
Last updated
Was this helpful?