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