给出以下.json文件:
[
{
"name" : "New York",
"number" : "732921",
"center" : [
"latitude" : 38.895111,
"longitude" : -77.036667
]
},
{
"name" : "San Francisco",
"number" : "298732",
"center" : [
"latitude" : 37.783333,
"longitude" : -122.416667
]
}
]
Run Code Online (Sandbox Code Playgroud)
我准备了两个类来表示包含的数据:
public class Location {
public String name;
public int number;
public GeoPoint center;
}
Run Code Online (Sandbox Code Playgroud)
...
public class GeoPoint {
public double latitude;
public double longitude;
}
Run Code Online (Sandbox Code Playgroud)
为了解析.json文件中的内容,我使用Jackson 2.2.x并准备了以下方法:
public static List<Location> getLocations(InputStream inputStream) {
ObjectMapper objectMapper …Run Code Online (Sandbox Code Playgroud) 我使用Spring restTemplate.我在单独的应用程序中将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();
}
Run Code Online (Sandbox Code Playgroud)
如果我要求在浏览器中向我显示所有用户,它会向我显示xml.没关系.但是,当我尝试使用它时:
@Test
public void testGetAll() {
List list = new RestTemplate().getForObject(URL + "all", List.class);
System.out.println(list);
}
Run Code Online (Sandbox Code Playgroud)
我有
WARNING: GET request for "http://localhost:8080/REST/all" resulted in 500 (Internal Server Error); invoking error handler
Run Code Online (Sandbox Code Playgroud)
我试着调试这个.方法工作期间没有例外.浏览器向我展示了用户的xml.有什么不对?
另外,我想知道,如何从模板对象中获取状态代码或消息(用于测试)?
谢谢你的回答.
编辑:
我修改了我的测试方法:
@Test
public void testGetAll() {
RestTemplate template = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
Jaxb2RootElementHttpMessageConverter jaxbMessageConverter …Run Code Online (Sandbox Code Playgroud) 我正在使用spring数据(mongoDb),我有我的存储库:
public interface StoriesRepository extends PagingAndSortingRepository<Story, String> {}
Run Code Online (Sandbox Code Playgroud)
然后我有一个控制器:
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Page<StoryResponse>> getStories(Pageable pageable) {
Page<StoryResponse> stories = storiesRepository.findAll(pageable).map(StoryResponseMapper::toStoryResponse);
return ResponseEntity.ok(stories);
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但我无法使用RestTemplate getForEntity方法使用我的端点:
def entity = restTemplate.getForEntity(getLocalhost("/story"), new TypeReference<Page<StoryResponse>>(){}.class)
Run Code Online (Sandbox Code Playgroud)
我应该提供什么类来成功反序列化我的实体页面?
Abstract控制器类需要REST中的对象列表.使用Spring RestTemplate时,它不会将其映射到所需的类,而是返回Linked HashMAp
public List<T> restFindAll() {
RestTemplate restTemplate = RestClient.build().restTemplate();
ParameterizedTypeReference<List<T>> parameterizedTypeReference = new ParameterizedTypeReference<List<T>>(){};
String uri= BASE_URI +"/"+ getPath();
ResponseEntity<List<T>> exchange = restTemplate.exchange(uri, HttpMethod.GET, null,parameterizedTypeReference);
List<T> entities = exchange.getBody();
// here entities are List<LinkedHashMap>
return entities;
}
Run Code Online (Sandbox Code Playgroud)
如果我用,
ParameterizedTypeReference<List<AttributeInfo>> parameterizedTypeReference =
new ParameterizedTypeReference<List<AttributeInfo>>(){};
ResponseEntity<List<AttributeInfo>> exchange =
restTemplate.exchange(uri, HttpMethod.GET, null,parameterizedTypeReference);
Run Code Online (Sandbox Code Playgroud)
它工作正常.但不能放入所有子类,任何其他解决方案.
我已经使用了这个答案中的解决方案: 使用 Spring RestTemplate 获取 JSON 对象列表 它工作得很好。它完全符合我的需要。
ProcessDefinition[] response = restTemplate.getForObject(url, ProcessDefinition[].class);
Run Code Online (Sandbox Code Playgroud)
是否足够:
return Arrays.asList(response);
Run Code Online (Sandbox Code Playgroud)
或者这样会更好:
return Arrays.asList(Optional.ofNullable(response).orElse(new ProcessDefinition[0]));
Run Code Online (Sandbox Code Playgroud)
PS 抱歉开始新话题,但我的业力不允许我评论答案。
我需要调用一个期望Pageable字段的端点:
@GetMapping
public Page<ProductDTO> listProducts(Pageable pageable) {
return productService.findProducts(pageable);
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中我有这个代码:
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.add("page", String.valueOf(0));
URI url = defaultURI(port, "/products", parameters);
ParameterizedTypeReference<RestResponsePage<ProductDTO>> type = new ParameterizedTypeReference<RestResponsePage<ProductDTO>>() {};
ResponseEntity<RestResponsePage<ProductDTO>> response = restTemplate.exchange(url.toString(), HttpMethod.GET, httpEntity, type);
Run Code Online (Sandbox Code Playgroud)
PageImpl不包含默认构造函数,所以为了避免这个问题我创建了一个类,如下所示传递给ParameterizedTypeReference:
@JsonIgnoreProperties(ignoreUnknown = true) @Getter @Setter
public class RestResponsePage<T> extends PageImpl<T> implements Serializable {
private static final long serialVersionUID = 3844794233375694591L;
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public RestResponsePage(@JsonProperty("content") List<T> content,
@JsonProperty("number") int page,
@JsonProperty("size") int size,
@JsonProperty("totalElements") long totalElements) …Run Code Online (Sandbox Code Playgroud) java ×6
rest ×3
resttemplate ×3
spring ×3
jackson ×2
arrays ×1
collections ×1
json ×1
spring-boot ×1
spring-data ×1
spring-rest ×1
spring-web ×1