获取球衣反序列化为子类

时间:2014-08-30 22:38:46

标签: java json serialization jersey

我试图让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 {
    ..
}

这个例子不起作用。我要求的可能性是什么?如果是这样,怎么样?

2 个答案:

答案 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