Testing Spring Data Rest endpoints using RestTemplate not working in SpringBoot 2.0.0.BUILD-SNAPSHOT

徘徊边缘 提交于 2019-12-13 07:30:40

问题


I am using Spring Data REST for exposing Spring Data JPA repositories as REST endpoints.

@Entity
@Table(name = "USERS")
public class User implements Serializable
{
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
    private String email;
    private String password;
}

public interface UserRepository extends JpaRepository<User, Integer>
{
}

While using SpringBoot 1.5.3.RELEASE I could test the endpoint http://localhost:8080/users using RestTemplate as follows:

@Test
public void testGetUsers()
{
    RestTemplate restTemplate = restTemplate();

    ResponseEntity<PagedResources<User>> responseEntity = 
            restTemplate.exchange(
                            "http://localhost:8080/users",
                            HttpMethod.GET, 
                            null, 
                            new ParameterizedTypeReference<PagedResources<User>>()
                            {}, 
                            Collections.emptyMap()
                            );
    PagedResources<User> userResource = responseEntity.getBody();
    Collection<User> users = userResource.getContent();
    assertNotNull(users);
}

protected RestTemplate restTemplate() 
{
      ObjectMapper mapper = new ObjectMapper();
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      mapper.registerModule(new Jackson2HalModule());

      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
      converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
      converter.setObjectMapper(mapper);
      return new RestTemplate(Collections.<HttpMessageConverter<?>> singletonList(converter));
}

But when I upgrade to SpringBoot 2.0.0.BUILD-SNAPSHOT, I am getting the following exception.

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [org.springframework.hateoas.PagedResources<com.myapp.entities.User>] and content type [application/hal+json;charset=UTF-8]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:117)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:946)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:930)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:684)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:650)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:598)
    at com.myapp.demo.SpringbootDataRestDemoApplicationTest.testGetUsers(SpringbootDataRestDemoApplicationTest.java:53)

Any pointers to fix the issue?

PS: I tried using @Autowired TestRestTemplate which internally uses configured ObjectMapper but same issue, working fine with 1.5.3.RELEASE but failing with 2.0.0.BUILD-SNAPSHOT.

@RunWith(SpringRunner.class)
@SpringBootTest(classes=DemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DemoApplicationTests
{

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testGetUsers()
    {
        ResponseEntity<PagedResources<User>> responseEntity =
                restTemplate.exchange("/users",
                                        HttpMethod.GET, 
                                        null, 
                                        new ParameterizedTypeReference<PagedResources<User>>() {}
                                        );
        assertTrue(responseEntity.getStatusCode() == HttpStatus.OK);
        PagedResources<User> userResource = responseEntity.getBody();
        Collection<User> users = userResource.getContent();
        assertNotNull(users);
        assertEquals(3, users.size());
    }   
}

With this remaining data ((links, page) is being populated in ResponseBody correctly but content is becoming as emptylist.

来源:https://stackoverflow.com/questions/43991995/testing-spring-data-rest-endpoints-using-resttemplate-not-working-in-springboot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!