Java REST客户端restTemplate可以';无法获取对象集合
我使用springrest模板。我在单独的应用程序中做了一个REST服务和客户端作为单元测试。我有返回用户列表的方法和用户创建的方法:Java REST客户端restTemplate可以';无法获取对象集合,java,spring,rest,collections,resttemplate,Java,Spring,Rest,Collections,Resttemplate,我使用springrest模板。我在单独的应用程序中做了一个REST服务和客户端作为单元测试。我有返回用户列表的方法和用户创建的方法: @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.TEXT_XML }) @Path("/all") public Response getAllUsers() { List<User> list = dao.ge
@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON,
MediaType.TEXT_XML })
@Path("/all")
public Response getAllUsers() {
List<User> list = dao.getAll();
GenericEntity<List<User>> result = new GenericEntity<List<User>>(list) {
};
return Response.status(Status.OK).entity(result).build();
}
我得到
我试着调试这个。方法工作期间没有异常。浏览器向我展示了xml和用户。
有什么不对劲
另外,我想知道如何从模板对象(用于测试)获取状态代码或消息
谢谢你的回答
编辑:
我修改了我的测试方法:
@Test
public void testGetAll() {
RestTemplate template = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter();
List<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_XML);
jaxbMessageConverter.setSupportedMediaTypes(mediaTypes);
messageConverters.add(jaxbMessageConverter);
template.setMessageConverters(messageConverters);
List list = template.getForObject(URL + "all",
ArrayList.class);
System.out.println(list);
}
您可以使用
restemplate.getForEntity()
。它将返回带有所有响应信息(包括状态)的ResponseEntity
。当您设置Jaxb2RootElementHttpMessageConverter
时,您将覆盖restemplate
附带的默认转换器。其中一个默认转换器(我认为是字符串转换器)可以处理text/xml
类型。删除整个Jaxb2RootElementHttpMessageConverter
,但在需要ArrayList.class
而不是List.class
时保留该部分,这将起作用:
@Test
public void testGetAll() {
RestTemplate template = new RestTemplate();
List list = template.getForObject(URL + "all",
ArrayList.class);
System.out.println(list);
}
您可能还需要添加一个accept
标题来选择使用text/xml
,而不是其他生成的类型:
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(new MediaType[] {MediaType.TEXT_XML}));
并将exchange
与restemplate
一起使用(而不是getForObject
):
List List=template.exchange(URL+“all”,新的HttpEntity(requestHeaders()),ArrayList.class);
也许这样
RestTemplate template = new RestTemplate(true);
ResponseEntity<TblGps[]> responseEntity = restTemplate.getForEntity(urlGETList, TblGps[].class);
TblGps[]=responseEntity.getBody();
RestTemplate=新的RestTemplate(true);
ResponseEntity ResponseEntity=restemplate.getForEntity(urlGETList,TblGps[].class);
TblGps[]=responseEntity.getBody();
您需要使用列表的具体实现,例如,您可以使用ArrayList
,请参见以下示例:
ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);
响应可能需要指定要接收的内容类型?由于该方法生成3种不同的内容类型,将使用哪种类型继续处理您的请求?@承认,我尝试过这样做,但我遇到了一个例外。我刚刚更新了我的问题,解释了这一点。如果您将List
改为ArrayList
,是否会出现与以前相同的行为。另一件事-可能是您需要一些根元素来包装您的集合。某些类将您的集合作为字段,并将使用JaxB注释正确映射。是的,行为相同。一个不同之处是stacktrace中不是[class java.util.ArrayList],而是ListGood。它将解决一个小问题。但我仍然无法提取用户列表。我试过这样做:ResponseEntity list=template.getForEntity(URL+“all”,ArrayList.class);但无法提取响应:未找到响应类型[class java.util.ArrayList]和内容类型[application/xml]的合适HttpMessageConverter。但是我添加了application/xml作为媒体类型看看我的答案为什么要使用arraylist安装的对象数组…ResponseEntity ResponseEntity=restemplate.getForEntity(urlGETList,TblGps[].class);然后是TblGps[]=responseEntity.getBody();我需要在哪里定义RequestHeader以及如何将其与模板连接?@OleksandrHubachov-抱歉,我添加了另一行代码来实现这一点。哦……我不知道是什么问题。。。我这样做了:HttpHeaders requestHeaders=newhttpheaders();setAccept(Arrays.asList(newmediatype[]{MediaType.APPLICATION_XML}));ResponseEntity list=template.exchange(URL+“all”、HttpMethod.GET、新的HttpEntity(requestHeaders)、ArrayList.class);但我还是得到了同样的例外…你删除了转换器定义吗?@Avi我也有一个关于RestTemplate的类似问题。如果可能的话,你能帮我吗?很好的解决方案。当List.class不合适时工作。干得好。你能解释一下为什么这不起作用吗?responseEntityGameSettings=REST_TEMPLATE.getForEntity(sourceUrl、List.class、variables);请看一看我为这个主题提供的另一个答案——它更详细。另请参见。此解决方案的问题是它也将所有内部列表转换为数组。我得到java.lang.ClassCastException:java.util.LinkedHashMap无法转换为用户
。这是一种获取通用列表的方法,而不是转换为特定类-
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(new MediaType[] {MediaType.TEXT_XML}));
List list = template.exchange(URL + "all", new HttpEntity<String>(requestHeaders()), ArrayList.class);
RestTemplate template = new RestTemplate(true);
ResponseEntity<TblGps[]> responseEntity = restTemplate.getForEntity(urlGETList, TblGps[].class);
TblGps[]=responseEntity.getBody();
ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);
ResponseEntity<? extends ArrayList<HashMap<String,Object>>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<HashMap<String,Object>>>)ArrayList.class, parameterId);