我试图让Jersey自动反序列化为我声明的类的子类实例。
说A有一个名为&#34的字符串字段; a"。 B extends A有一个名为" b"的字符串字段。类似地,C extends A有一个名为" c"。
的字符串字段我希望输入有字段" a"和" b"要被反序列化为B的实例,并且输入具有字段" a"和" c"要反序列化为具有一个端点定义的C实例,将post body参数类型指定为A,如下所示。
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ServerResponse translateClientRequest(final A postBody) throws
ProxyException {
..
}
这个例子不起作用。我要求的可能性是什么?如果是这样,怎么样?
答案 0 :(得分:1)
您可能需要使用自定义响应(或请求)映射器。
1.-创建一个实现MessageBodyReader的类,负责编写/读取请求
@Provider
public class MyMessageBodyReader
implements MessageBodyReader<A> {
@Override
public boolean isReadable(final Class<?> type,final Type genericType,
final Annotation[] annotations,
final MediaType mediaType) {
// you can check if the media type is JSon also but it's enougth to check
// if the type is a subclass of A
return A.class.isAssignableFrom(type); // is a subclass of A?
}
@Override
public A readFrom(final Class<A> type,
final Type genericType,
final Annotation[] annotations,
final MediaType mediaType,
final MultivaluedMap<String,String> httpHeaders,
final InputStream entityStream) throws IOException,
WebApplicationException {
// create an instance of B or C using Jackson to parse the entityStream (it's a POST method)
}
}
2.-在您的应用中注册Mappers
public class MyRESTApp
extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(MyMessageBodyReader.class);
return s;
}
}
Jersey将扫描所有已注册的Mapper,调用它们的isReadable()方法,直到返回true ...如果是,则此MessageBodyReader实例将用于序列化内容
答案 1 :(得分:0)
听起来你想要一个自定义MessageBodyReader
来确定类并将数据转换为适当的子类。
有关示例,请参阅JAX-RS Entity Providers。