When working with REST endpoints at times you want extra capability from one REST end point. To support polymorphic subtypes or operations, you may want to send a wrapper Map that gives some context information. The information could be about what types the sub-maps are.
Let's show a quick example of this using the
TodoService
from the previous examples. The complete code for this example can be found here Todo Map.Example of using a Map instead of a strongly typed POJO
import io.advantageous.boon.core.reflection.MapperSimple;
@RequestMapping(value = "/todo", method = RequestMethod.POST,
description = "add a todo item to the list", summary = "adds todo",
returnDescription = "returns true if successful")
public boolean add(final Map<String, Object> todoMap) {
String id = todoMap.get("id").toString();
String name = (String)todoMap.get("name");
String description = (String)todoMap.get("description");
Long createTime = (Long)todoMap.get("createTime");
Map<String, Object> parent = (Map<String, Object>) todoMap.get("parent");
MapperSimple simple = new MapperSimple();
Category category = simple.fromMap(parent, Category.class);
Todo todo = new Todo(name, description, createTime, category);
todoMap.put(id, todo);
return true;
}
Notice that the
add
method now takes a Map<String, Object>
instead of a Todo
POJO. We can pull items out of the map, which equate to properties of a Todo
item.
For this example, I changed the
Todo
to have a property of type Category
.New Property of type Category
@Description("A `TodoItem`.")
public class Todo {
@Description("Holds the description of the todo item")
private final String description;
@Description("Holds the name of the todo item")
private final String name;
private String id;
private final long createTime;
private final Category parent;
...
public class Category {
private final String name;
public Category(String name) {
this.name = name;
}
}
The category payload is expressed as another JSON object, aka, a Java Map
Map<String, Object> parent = (Map<String, Object>) todoMap.get("parent");
.
We can pull out the sub map which represents the category and use a
MapperSimple
to convert the map into a POJO (Category).Converting a map to a POJO
Map<String, Object> parent = (Map<String, Object>) todoMap.get("parent");
MapperSimple simple = new MapperSimple();
Category category = simple.fromMap(parent, Category.class);
QBit has both a
MapperSimple
and a MapperComplex
, which both implement Mapper
. A Mapper
converts maps into objects. The MapperComplex
allows you to ignore properties, decide how to read fields, etc.
This example was kept fairly simple. You could imagine a more involved example where you read fields and then decide which POJO to instantiate from a list of subclasses.
Read more:
- QBit Microservice Hello World tutorial
- QBit Microservice Hello World Part 2
- QBit Microservice Hello World Health Checks
- QBit Microservice Hello World Stats, Metrics, and Monitoring
- QBit Microservice Reactive programming tutorial
QBit is the Java microservice lib. QBit is a reactive programming lib for building microservices and focuses on JSON, HTTP, WebSocket, and REST. QBit uses reactive programming to build elastic REST, and WebSockets based cloud friendly, web services. SOA evolved for mobile and cloud. ServiceDiscovery, Health, reactive StatService, events, Java idiomatic reactive programming for Microservices.
No comments:
Post a Comment