Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST客户端restTemplate可以';无法获取对象集合_Java_Spring_Rest_Collections_Resttemplate - Fatal编程技术网

Java REST客户端restTemplate可以';无法获取对象集合

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

我使用springrest模板。我在单独的应用程序中做了一个REST服务和客户端作为单元测试。我有返回用户列表的方法和用户创建的方法:

@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);