2014-04-24 10 views
32

Использование Spring Data REST с JPA в версии 2.0.2.RELEASE.Отключить язык приложений гипертекста (HAL) в JSON?

Как отключить язык приложений гипертекста (HAL) в JSON? http://stateless.co/hal_specification.html

Я уже много пробовал, но безрезультатно. Например, я установил заголовки Accept и Content-type в «application/json» вместо «application/hal + json», но я все еще получаю содержимое JSON с гиперссылками.

Например, я хотел бы получить что-то вроде:

{ 
"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 
    } 
} 

Вместо:

{ 
"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" 
    } 
} 
} 

Спасибо за вашу помощь.

ответ

35

(гипер) типы носителей

Настройки по умолчанию для Spring Data REST использовать HAL как формат представления гипермедиа по умолчанию, так что сервер будет возвращать следующие за предоставленные Accept заголовки:

  • Нет заголовка ->application/hal+json -> HAL
  • application/hal+json ->application/hal+json -> HAL
  • application/json ->application/json -> HAL (это то, что конфигурируется по умолчанию)
  • application/x-spring-data-verbose+json ->application/x-spring-data-verbose+json -> Формат данных с особыми данными (с использованием links для контейнера ссылок и content в качестве обертки для элементов коллекции.

При настройке RepositoryRestConfiguration.setDefaultMediaType(…) в формат, не HAL, сервер будет возвращать определенный формат JSON Spring Data, если вы явно не просят application/hal+json. Разумеется, вариант конфигурации, вероятно, немного вводит в заблуждение, поэтому я добавил DATAREST-294, чтобы улучшить это. Вопрос был решен в 2.1 RC1 (Dijkstra) 2014.

Обратите внимание, что нам действительно нужен формат гипермедиа, чтобы иметь возможность выражать отношения между управляемыми ресурсами и обеспечивать возможность обнаружения сервера. Таким образом, вы не сможете полностью избавиться от него. Это в основном связано с тем, что вы можете легко свернуть сервер, если вы обнаружите объекты, которые имеют двунаправленные отношения или составляют огромный граф объектов.

связанные встраивание объекты

Если вы не хотите иметь секторов, связанных с и всегда встраивать их, один из вариантов является просто исключить из SectorRepository экспортируется как REST ресурс в первую очередь. Вы можете достичь этого, аннотируя интерфейс репозитория с помощью @RepositoryRestResource(exported = false).

Чтобы получить представление, которое вы отправили в своем нижнем примере, просмотрите функцию projections, представленную в Spring Data REST 2.1 M1. Это в основном позволяет создавать необязательные представления на ресурсе, который может отличаться от стандартного с помощью простого интерфейса.

Вы бы в основном определить интерфейс:

@Projection(name = "foo", types = YourDomainClass.class) 
interface Inlined { 

    // list all other properties 

    Sector getSector(); 
} 

Если вы либо поместить этот интерфейс в (суб) пакет вашего класса домена или вручную зарегистрировать его через RepositoryRestConfiguration.projectionConfiguration() ресурсы, разоблачающие YourDomainClass принимает параметр запроса projection, чтобы в этом примере прохождение в foo отобразило бы встроенное представление так, как вы хотите.

This commit имеет более подробную информацию об этой функции в целом, this commit имеет пример проекции.

+0

Как я уже сказал, я попытался использовать * @ RepositoryRestResource (exported = false) * для того, чтобы секторы были встроены. Однако в этом случае я получаю JSON с «сектором»: null. Итак, я смотрю Spring Spring REST 2.1 M1 и вариант прогнозов. – jplandrain

+0

Описание, данное в [DATAREST-221] (https://jira.spring.io/browse/DATAREST-221) билет, на который вы ссылаетесь, - это именно та ситуация, с которой я столкнулся. – jplandrain

+0

Мне потребовалось немного времени, чтобы понять все детали, но это работает. Я делал две ошибки: 1. Я не создал класс Projection под моим пакетом сущностей (или подпакету сущностей). Вы сказали мне сделать это, но я не заметил 2. Мне нужно создать интерфейс SectorSomething и вернуть его в классе Projection (а не в классе сектора, как написано в вашем ответе). Большое спасибо за Вашу помощь. – jplandrain

Смежные вопросы