相关疑难解决方法(0)

如何使用Spring RestTemplate使用Page <Entity>响应

我正在使用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)

我应该提供什么类来成功反序列化我的实体页面?

java rest spring spring-data spring-data-rest

30
推荐指数
4
解决办法
2万
查看次数

使用Pageable字段测试端点时出现JsonMappingException

我需要调用一个期望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 rest jackson spring-boot

5
推荐指数
1
解决办法
1493
查看次数

RestTemplate映射页面'页面大小不得小于1'

我有一个 REST API 端点,它将返回一个Page<User>. 我想为此端点提供一些测试,我发现了这个问题,我可以使用这个答案(接受的答案已过时)。当我尝试实现这个时,我注意到另一个答案有另一个实现,据说是针对 spring 2.0 的。

但是,当使用这个(下面的代码)时;我从映射器那里得到了一个例外。我注意到在 Wireshark 中Page正确返回并填充。当我使用像Postman这样的工具手动发出请求时,我也正确地获取了Page.

控制器:

@GetMapping("/")
Page<User> findAll(@RequestParam("page") int page, @RequestParam("size") int size);
Run Code Online (Sandbox Code Playgroud)

RestResponsePage(如此处找到

package org.company.product.userservice.helpers;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

import java.util.ArrayList;
import java.util.List;

public class RestResponsePage<T> extends PageImpl<T> {
    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public RestResponsePage(@JsonProperty("content") List<T> content,
                            @JsonProperty("number") int number,
                            @JsonProperty("size") int size,
                            @JsonProperty("totalElements") Long totalElements,
                            @JsonProperty("pageable") JsonNode pageable,
                            @JsonProperty("last") …
Run Code Online (Sandbox Code Playgroud)

java spring jackson spring-boot

5
推荐指数
1
解决办法
1万
查看次数

Spring Boot页面反序列化-PageImpl没有构造函数

尝试进行单元测试以从Spring Boot接收页面。如果与javascript一起使用,则可以很容易地反序列化页面,但是对于java,页面将失败。为spring添加了默认的构造函数(这是另一个stackoverflow帖子中的可接受答案),但是在这里不起作用。

单元测试

@Test
public void test_read_pagination_happy(@Autowired ObservationSet set) {

    repository.save(set);

    final HttpEntity<String> authHeaders = authentication.convert("", authSuccess);
    final ParameterizedTypeReference<RestResponsePage<ObservationSet>> responseType = new ParameterizedTypeReference<RestResponsePage<ObservationSet>>() {
    };
    // final ResponseEntity<String> result = restTemplate.exchange(base + "/api/v1/observationset", HttpMethod.GET, authHeaders, String.class);
    final ResponseEntity<RestResponsePage<ObservationSet>> result = restTemplate.exchange(base + "/api/v1/observationset", HttpMethod.GET, authHeaders,
                    responseType);
    System.out.println(result.getBody());
    assertSame(HttpStatus.OK, result.getStatusCode(), "incorrect status code");
}
Run Code Online (Sandbox Code Playgroud)

RestRespongePage类

class RestResponsePage<T> extends PageImpl<T> {

    private static final long serialVersionUID = 3248189030448292002L;

    public RestResponsePage(List<T> content, Pageable pageable, long total) {
        super(content, pageable, total);
    }

    public RestResponsePage(List<T> …
Run Code Online (Sandbox Code Playgroud)

spring pagination deserialization spring-boot

0
推荐指数
4
解决办法
3169
查看次数