如何使用java使用spring数据休息服务?

时间:2017-02-14 17:11:18

标签: spring rest spring-data

我有以下spring boot + data Rest存储库:

    @RepositoryRestResource(collectionResourceRel = "dto", path = "produtos")
    public interface ProdutoRepository extends CrudRepository<Produto, Integer> {
        @Query("SELECT p FROM Produto p where descricao LIKE CONCAT(UPPER(:like),'%')")
        List<Produto> findByLike(@Param("like") String like);
    }

我还有一个访问此方法的java客户端(这是我做这个的例子):

    String url = "http://localhost:8080/produtos/search/findByLike?like={like}";
    RestTemplate t = new RestTemplate();
    ProdutoDto resp = t.getForObject(url, ProdutoDto.class, txtLoc.getText());

ProdutoDto(这不是完全必要的):

public class ProdutoDto extends HalDto<Produto> {}

HalDto:

public class HalDto<T extends ResourceSupport> extends ResourceSupport {
    @JsonProperty("_embedded")
    private EmbeddedDto<T> embedded;

    public EmbeddedDto<T> getEmbedded() {
        return embedded;
    }

    public void setEmbedded(EmbeddedDto<T> embedded) {
        this.embedded = embedded;
    }
}

EmbeddedDto:

public class EmbeddedDto<T> {
    @JsonProperty("dto")
    private List<T> dtoList;

    public List<T> getDtoList()
    {
        return dtoList;
    }

    public void setDto(List<T> dtoList) {
        this.dtoList = dtoList;
    }
}

这些类是必要的(我认为)因为Spring Data以HAL(https://en.wikipedia.org/wiki/Hypertext_Application_Language)格式返回数据。

注意:Produto必须扩展ResourceSupport。

警告:所有collectionResourceRel必须命名为&#34; dto&#34;它只适用于集合(可以调整)。

这是正确的方法吗?

我已经google了一下,发现了很多做服务器端的例子,但几乎没有关于构建客户端的例子。

感谢。

1 个答案:

答案 0 :(得分:0)

我发现这是一个似乎运作良好的解决方案。

首先,设置你的DNNClassifier以便它需要JSON / HAL并知道如何处理它:

RestTemplate

然后,您可以使用@Bean public RestTemplate restTemplate() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new Jackson2HalModule()); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); messageConverter.setObjectMapper(objectMapper); messageConverter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON, MediaType.APPLICATION_JSON_UTF8)); return new RestTemplate(Arrays.asList(messageConverter)); } 的{​​{1}}方法指定您希望结果为exchange

RestTemplate

您可以通过调用上面定义的ResponseEntity<PagedResources<Producto>>方法来实例化ResponseEntity<PagedResources<Producto>> resultResponse = restTemplate.exchange(uri, HttpMethod.GET, HttpEntity.EMPTY, new ParameterizedTypeReference<PagedResources<Producto>>(){}); if(resultResponse.getStatusCode() == HttpStatus.OK){ Collection<Producto> results = resultResponse.getBody().getContent(); log.info("{} results obtained", results.size()); } ,也可以注入(自动装配)它。