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

标签 java json rest web-services jax-rs

我在 REST POST 调用方面遇到一些问题。我正在使用 JSON 对象。 假设我有以下 2 门类(class)

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 以及所有属性,其中还包括父类中的所有属性。但是当我调试这个子对象时,它没有提供父属性。我需要为此使用 GSON 或任何其他库吗?

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

我只能看到 StrikePrice 和 optionType 的数据。

最佳答案

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

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

关于java - 在 REST POST 调用期间未从继承对象获取所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52737396/

相关文章:

c# - 如何使用 web api 获取资源的可用性?

json - 如何在 scaja.js 中将 json 字符串解析为 case 类,反之亦然

REST API - 需要关于架构的意见

java - 有没有办法完全重置 Ignite 状态?

Java web 应用程序 web.xml 参数到 POJO

php - 更改json_encode()输出结构

python - 从 pandas 数据帧生成自定义 JSON 格式输出

javascript - MongoDB中设计Shift schema的疑惑

java - MIDI Java 生成困惑的声音

java - 如何使用 JButton 从 JTextField 获取 int