出于代码可重用性的目的,我有一个超级接口,还有一些扩展它,如:
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时似乎仍存在同样的问题。