簡體   English   中英

如何使用java使用spring數據休息服務?

[英]How to consume a spring data rest service with java?

我有以下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必須命名為“dto”,它只適用於集合(可以調整)。

這是正確的方法嗎?

我已經google了一下,發現了許多做服務器端的例子,但幾乎沒有建立客戶端的例子。

謝謝。

這是我發現的一個似乎運作良好的解決方案。

首先,設置您的RestTemplate以便它期望JSON / HAL並知道如何處理它:

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

}

然后,您可以使用RestTemplateexchange方法指定您希望結果為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());
}

您可以通過調用上面定義的restTemplate()方法來實例化restTemplate ,也可以注入(自動裝配)它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM