не получить все свойства унаследованного объекта во время вызова REST POST - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с вызовом REST POST.Я использую объект JSON.Предположим, у меня есть 2 класса ниже

Class Parent extends Serializable
{
    private static final long serialVersionUID = 1L;
    @Key
    protected String Market;
    @Key
    protected String Symbol;
}

Class Child extends Parent
{
    private static final long serialVersionUID = -4252878751127065794L;
    private Double  strikePrice;
    private String  optionType;
}

@POST
@Path("/addProduct")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addProduct(Child child) {
   --somecode--     
}

Теперь я передаю JSON через Postman со всеми свойствами, которые также включают все свойства из родительского класса.Но когда я отлаживаю этот дочерний объект, он не дает родительских свойств.Нужно ли использовать GSON или любую другую библиотеку для этого?

JSON
{
    "Market": "BSE",
    "Symbol": "Infosys",
    "strikePrice": 100,
    "optionType": "Put"
}

Я могу видеть только strikePrice и optionType с данными.

1 Ответ

0 голосов
/ 11 октября 2018

Я нашел одно решение.Нам нужно добавить MessageBodyReader для пользовательского ответа.Я не знаю наилучшей практики, но она будет работать без проблем.

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Scanner;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.Providers;

import common.SerializeUtil;

@Provider
public class CustomMessageBodyReader implements MessageBodyReader<Child> {

    @Context
    private Providers providers;

    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // TODO Auto-generated method stub
        return Parent.class.isAssignableFrom(type); 
    }

    @Override
    public Child readFrom(Class<Child> type, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
            throws IOException, WebApplicationException {
        String entity = toString(entityStream);
        Child child = SerializeUtil.fromString(entity, Child.class);
        return child;
    }

    public static String toString(InputStream inputStream) {
        return new Scanner(inputStream, "UTF-8")
                .useDelimiter("\\A").next();
    }

}

Вам также необходимо зарегистрировать это в конфигурации вашего сервиса, как показано ниже

ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(CustomMessageBodyReader.class);

Пожалуйста, не стесняйтесь, чтобы предоставить лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...