我已经安装了 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();
}