REST POST调用期间未从继承的对象获取所有属性

时间:2018-10-10 09:51:53

标签: java json rest web-services jax-rs

我在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--     
}

现在,我正在通过Postman传递JSON,其中包含所有属性,其中也包括Parent类的所有属性。但是,当我调试此子对象时,它没有提供父级属性。我需要为此使用GSON或任何其他库吗?

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

我只能看到带有数据的strikePrice和optionType。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案。我们需要为自定义响应添加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);

请随时提供最佳解决方案。