json - estándar - hateoas
Deshabilitar Hypertext Application Language(HAL) en JSON? (1)
(Hyper) tipos de medios
La configuración predeterminada para Spring Data REST usa HAL como el formato de representación de hipermedia predeterminado, por lo que el servidor devolverá lo siguiente para los encabezados Accept
dados:
- Sin encabezado ->
application/hal+json
-> HAL -
application/hal+json
->application/hal+json
-> HAL -
application/json
->application/json
-> HAL (esto es lo que configura por defecto) -
application/x-spring-data-verbose+json
->application/x-spring-data-verbose+json
-> un formato específico de Spring Data (utilizandolinks
para el contenedor de enlaces y elcontent
como contenedor para los elementos de la colección).
Si configura RepositoryRestConfiguration.setDefaultMediaType(…)
en un formato que no sea HAL, el servidor devolverá el formato JSON específico de Spring Data a menos que solicite explícitamente la application/hal+json
. Es cierto que la opción de configuración es probablemente un poco engañosa, así que DATAREST-294 para mejorar esto. El problema se resolvió en 2.1 RC1 (Dijkstra) 2014.
Tenga en cuenta que efectivamente necesitamos un formato hipermedia implementado para poder expresar las relaciones entre los recursos administrados y permitir la visibilidad del servidor. Así que no hay forma de que puedas deshacerte de él por completo. Esto se debe principalmente al hecho de que puede bloquear fácilmente el servidor si expone entidades que tienen relaciones bidireccionales o conforman un enorme gráfico de objetos.
Entidades relacionadas en línea
Si nunca desea tener sectores vinculados y siempre alineados, una opción es simplemente excluir el SectorRepository
de ser exportado como un recurso REST en primer lugar. Puede lograr esto anotando la interfaz del repositorio con @RepositoryRestResource(exported = false)
.
Para obtener una representación devuelta como se publicó en el ejemplo inferior, eche un vistazo a la función de projections introducida en Spring Data REST 2.1 M1. Básicamente, le permite crear vistas opcionales de un recurso que pueden diferir de las predeterminadas a través de una interfaz simple.
Básicamente definirías una interfaz:
@Projection(name = "foo", types = YourDomainClass.class)
interface Inlined {
// list all other properties
Sector getSector();
}
Si coloca esta interfaz en un (sub) paquete de su clase de dominio o lo registra manualmente a través de RepositoryRestConfiguration.projectionConfiguration()
los recursos que exponen YourDomainClass
aceptarán una projection
parámetro de solicitud para que al pasar en foo
en este ejemplo, la representación en línea aparezca como lo quieres.
Esta confirmación tiene más información sobre la característica en general, esta confirmación tiene una proyección de ejemplo definida.
Utilizando Spring Data REST con JPA en la versión 2.0.2.RELEASE.
¿Cómo puedo deshabilitar el Hypertext Application Language (HAL) en el JSON? http://stateless.co/hal_specification.html
Ya he intentado muchas cosas, pero fue en vano. Por ejemplo, configuré los encabezados Accept y Content-type en "application / json" en lugar de "application / hal + json", pero aún recibo el contenido JSON con hipervínculos.
Por ejemplo, me gustaría obtener algo como:
{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"sector" : {
"description" : "Marketing",
"average profit": 545656665,
"average employees": 75,
"average profit per employee": 4556
}
}
En lugar de:
{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"_links" : {
"self" : {
"href" : "http://localhost:8080/app/companies/1"
},
"sector" : {
"href" : "http://localhost:8080/app/companies/1/sector"
}
}
}
Gracias por tu ayuda.