Pregunta Deshabilitar Hypertext Application Language (HAL) en JSON?


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.


32
2018-04-24 08:46


origen


Respuestas:


(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 el dado Accept encabezados:

  • 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 (usando links para el contenedor de enlaces y content como envoltorio para los artículos de la colección.

Si configuras RepositoryRestConfiguration.setDefaultMediaType(…) a un formato que no sea HAL, el servidor devolverá el formato JSON específico de Spring Data a menos que solicite explícitamente application/hal+json. Es cierto que la opción de configuración es probablemente un poco engañosa, así que archivé 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 no desea tener sectores vinculados y siempre en línea, 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 publicó en su ejemplo inferior, eche un vistazo a la proyecciones característica 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 la registra manualmente a través de RepositoryRestConfiguration.projectionConfiguration() los recursos que exponen YourDomainClass aceptará un parámetro de solicitud projection para que pase foo en este ejemplo representaría la representación en línea como lo desee.

Este compromiso tiene más información sobre la función en general, este compromiso tiene una proyección de ejemplo definida.


36
2018-04-25 07:52