qbit icon indicating copy to clipboard operation
qbit copied to clipboard

ENHANCE: ADD SUPPORT FOR JACKSON AND GSON #45

Open mountainowl opened this issue 8 years ago • 1 comments

I'm trying to use Jackson with Qbit. So far this is what I have.

Service code:

EndpointServerBuilder serverBuilder = managedServiceBuilder
                   .addEndpointService(serviceObject)
                   .getEndpointServerBuilder()
                   .setJsonMapper(new JacksonMapper());
           serverBuilder
                   .setFactory(new AltQbitFactory());

           serverBuilder
                   .build()
                   .startServer();

JacksonMapper.java

public class JacksonMapper implements JsonMapper {

    private static final ObjectMapper objectMapper = ObjectMapperConfiguration.getObjectMapper();

    public JacksonMapper() {
        System.out.println("Jackson Mapper Instantiated!");
    }

    @Override
    public Object fromJson(String json) {
        try {
            return objectMapper.readValue(json, Object.class);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public <T> T fromJson(String json, Class<T> cls) {

        TypeReference<T> typeReference = new TypeReference<T>() {
            @Override
            public Type getType() {
                return cls;
            }
        };

        try {
            return objectMapper.readValue(json, typeReference);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public <T> List<T> fromJsonArray(String json, Class<T> componentClass) {

        TypeReference<List<T>> typeReference = new TypeReference<List<T>>() {
            @Override
            public Type getType() {
                return componentClass;
            }
        };

        try {
            return objectMapper.readValue(json, typeReference);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String toJson(Object object) {
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public <K, V> Map<K, V> fromJsonMap(String json, Class<K> componentClassKey, Class<V> componentClassValue) {

//        SimpleModule module = new SimpleModule();
//        module.addKeySerializer(Date.class, new DateAsTimestampSerializer());

        return null;
    }
}

AltQbitFactory.java

public class AltQbitFactory extends BoonQBitFactory {

   @Override
   public JsonMapper createJsonMapper() {
       return new JacksonMapper();
   }
}

Everything get instantiated correctly, however when the request arrives, and StandardRequestTransformer#transform is called from HttpRequestServiceServerHandlerUsingMetaImpl#handleRestCall BoonJsonMapper is invoked even though I'm registering Jackson mapper and factory.

Any pointers will be really helpful.

mountainowl avatar Dec 06 '16 17:12 mountainowl

Send a pull request and I will add support. I'd love to have support for GSON and Jackson.

RichardHightower avatar Jan 18 '17 22:01 RichardHightower