Rick

Rick
Rick

Tuesday, September 15, 2015

QBit, Microservices REST lib, working with Map String, Object for types

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 TodoPOJO. 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 MapMap<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.
Kafka and Cassandra support, training for AWS EC2 Cassandra 3.0 Training