Spring Data Rest - _links
Editar 14/08/14 13:29
Minha próxima conclusão é que o formato hal + json produzido a partir do meu @RepositoryRestResource CrudRepository está incorreto.
O tutorial (http://spring.io/guides/gs/accessing-data-rest/) mostra a saída de uma entidade Rest JPA hipermídia como: (observe que não há elemento "rel" e "links" não é uma matriz)
{
"_links" : {
"people" : {
"href" : "http://localhost:8080/people{?page,size,sort}"
}
}
}
No entanto, os documentos de referência (http://docs.spring.io/spring-data/rest/docs/1.1.x/reference/html/intro-chapter.html) mostram que a saída deve ser:
{
"links" : [ {
"rel" : "customer",
"href" : "http://localhost:8080/customer"
}, {
"rel" : "profile",
"href" : "http://localhost:8080/profile"
}
}
Alguém sabe por que isso é?
=======================================
Editar 14/08/14: Eu levei minha depuração um passo adiante. Ao fornecer minha própria implementação de uma classe org.springframework.hateoas.ResourceSupport, que inspeciona o json por "_links" em vez de "links", eu dou um passo adiante. O erro é:
"Não é possível desserializar a instância do java.util.ArrayList fora do token START_OBJECT ..... através da cadeia de referência: com.ebs.solas.admin.test.SolicitorDTO [\" _ links \ "]"
Isso ocorre porque a classe org.springframework.hateoas.ResourceSupport parece exigir que o atributo links seja uma matriz json. E, por padrão, a saída json + hal produzida pela Spring Data para uma Entidade Restante não produz uma matriz (não há colchetes):
"_links" : {
"self" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx"
},
"solicitors" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx/solicitor
}
}
Espero que alguém dos fóruns da Spring possa me ajudar aqui.
==============================================
veja um esboço do meu código de repositório do Spring Data:
@RepositoryRestResource
public interface SolicitorFirmRepository extends CrudRepository<SolicitorFirm, String> {
}
@Entity
@RestResource
@Table(name="XXXX", schema = "XXX")
public class SolicitorFirm implements Serializable {
}
Isso gera com êxito o seguinte recurso de ódio:
{
"firmNumber" : "FXXXX",
"solicitorType" : "r",
"companyName" : "XXXX",
"address1" : "XXXX",
"address2" : "XXX",
"address3" : "XXX",
"address4" : null,
"phoneNumber" : "XXXXX",
"faxNumber" : "XXXXX",
"county" : "OY",
"_links" : {
"self" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX"
},
"solicitors" : {
"href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX/solicitors"
}
}
No entanto, quando eu defino um DTO para o uso do lado do cliente / controlador:
import org.springframework.hateoas.ResourceSupport;
public class SolicitorFirmDTO extends ResourceSupport {
.....
}
e use o seguinte código
RestTemplate rt = new RestTemplate();
String uri = new String("//xxxxx:9090/solas-admin-data-api/solicitors/Sxxxxx");
SolicitorFirmDTO u = rt.getForObject(uri, SolicitorFirmDTO.class, "SXXXX");
Estou tendo o erro a seguir:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: campo não reconhecido "_links" (classe com.ebs.solas.admin.test.SolicitorFirmDTO), não marcado como ignorável (7 propriedades conhecidas: xx])
Por alguma razão, o json produzido pelo Spring Data Rest adiciona os links da entidade em_links
enquanto a superclasse de recursos HATEOAS esperalinks
?
Alguém pode ajudar? este é um problema de versão ou preciso de uma configuração extra para mapear_links
paralinks
eu tenteiMappingJackson2HttpMessageConverter
e vários tipos de mídiaapplication/json+hal
para nenhum proveito.