我在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。
答案 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);
请随时提供最佳解决方案。