我有以下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了一下,发现了很多做服务器端的例子,但几乎没有关于构建客户端的例子。
感谢。
答案 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());
}
,也可以注入(自动装配)它。