将类的 T 泛型类型获取到新的 GenericType<List<T>>() Java 中的 T



我已经安装了 follwing 类,并使用 REST 调用实现了一个搜索方法获取给定类型 T 的对象列表。

public class AmapiService<T extends Resource> implements RestService<T> {

@Override
public List<T> search( MultivaluedMap<String, String> aQueryParams ) {
MultivaluedMap<String, String> lQueryParams = aQueryParams;
Client lClient = buildClient();
WebTarget ltarget = lClient.target( iRestDriver.target( aApiUrl ).getUri() );
for ( String lKey : lQueryParams.keySet() ) {
ltarget = ltarget.queryParam( lKey, lQueryParams.getFirst( lKey ) );
}
List<T> lObjects = null;
lObjects = ltarget.request( MediaType.APPLICATION_JSON ).get( new GenericType<List<T>>() {
} );
return lObjects;
}
}

这就是为类和搜索方法调用创建实例的方式。

AmapiService<RFQDefinition> RFQService =
new AmapiService<RFQDefinition>();
List<RFQDefinition> qfq = RFQService.search( lQueryParam );

当我运行此IM时收到以下错误

May 07, 2018 1:48:14 PM org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor aroundReadFrom
SEVERE: MessageBodyReader not found for media type=application/json, type=interface java.util.List, genericType=java.util.List<T>.

这意味着 RFQ 身份验证不会设置为new GenericType<List<T>>().中的 T

如何将AmapiService<T extends Resource>中的 T 类型设置为new GenericType<List<T>>()

如果我将其定义为new GenericType<List<RFQDefinition>>()而不是T它的工作

你对泛型的使用实际上在这里没有用处。

没有真正的通用实现,因为您的响应基于您提供给您使用的服务 (.get( new GenericType<List<T>>(){})( 的参数。类型参数对此无济于事,因为代码是由 jax-rs 实现调用的,该实现不通过静态链接。

换句话说,没有代码会使用以下参数编译和运行您的类/方法:

//this is not a valid use-case:
List<ActualType> res = search(aQueryParams);

一个简单的翻译可以是:Java泛型不会进入REST API。您必须静态地将 Java 类型用于 API 应该返回的模型(就像您对new GenericType<List<RFQDefinition>>()所做的那样(。

它与泛型无关。

服务器抱怨它没有任何MessageBodyReader来读取application/json正文。

通常,您可以将Jackson添加为应用程序的 json 解码/编码

阅读以下内容:

https://jersey.github.io/documentation/latest/media.html#json.jackson

我已经像这样更改了搜索方法实现,现在它正在工作。 iClass 您可以将其作为参数,例如:RFQDefinition.class

ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructCollectionType( List.class, iClass );
List<T> lObjects = null;
JsonArray lResponse = ltarget.request( MediaType.APPLICATION_JSON ).get( JsonArray.class );
try {
lObjects = mapper.readValue( lResponse.toString(), type );
} catch ( JsonParseException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( JsonMappingException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}  

相关内容

  • 没有找到相关文章

最新更新