JAX-RS客户端 - 如何使用Jackson从JSON反序列化通用参数

时间:2016-09-12 07:32:17

标签: java json rest cxf

出于代码可重用性的目的,我有一个超级接口,还有一些扩展它,如:

public interface AbstractService<T extends AbstractDto> {
    @GET
    @Path("/")
    @Produces("application/json")
    T get(@QueryParam("id") Long id);
}

@WebService
@Path("/office")
public interface OfficeService extends AbstractService<OfficeDto> { }

客户是:

OfficeService service = JAXRSClientFactory.create("http://...", OfficeService.class, 
    Arrays.asList(new Object[] {
        new org.codehaus.jackson.jaxrs.JacksonJsonProvider()
    }));
OfficeDto office = service.get(1L); // exception!

它以java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to OfficeDto

失败

如果我删除了泛型,一切都很好(除了代码在所有服务中重复)。似乎杰克逊不明白服务的T是实际的OfficeDto并且回到LinkedHashMap键值对反序列化(这适用于JavaScript,但不适用于Java客户端)。

如何在JAX-RS中使用通用参数?当前的实现是Apache CXF 3.1,但在切换到Jersey时似乎仍存在同样的问题。

0 个答案:

没有答案