При желании отключить формат HATEOAS в Spring Data Rest

Допустим, у меня есть существующее приложение с двумя конечными точками /people и /pants. Вызов GET /people возвращает:

[
    {
        "name":"john",
        "age":37,
        "pants":[
            {
                "color":"green",
                "brand":"levis",
                "size":"medium"
            },
            {
                "color":"indigo",
                "brand":"jncos",
                "size":"medium-with-huge-legs"
            }
        ]
    },
    {
        "name":"june",
        "age":23,
        "pants":[
            {
                "color":"pink",
                "brand":"gap",
                "size":"small"
            }
        ]
    }
]

Если бы я использовал Spring Data Rest и вызывал GET/person, я бы получил что-то вроде:

{
    "_links":{
        "next":{
            "href":"http://myapp.com/people?page=1&size=20"
        },
        "self":{
            "href":"http://myapp.com/people{&page,size,sort}",
            "templated":true
        },
        "search":{
            "href":"http://myapp.com/people/search"
        }
    },
    "_embedded":{
        "people":[
            {
                "name":"john",
                "age":37,
                "_links":{
                    "self":{
                        "href":"http://myapp.com/people/john"
                    },
                    "pants":{
                        "href":"http://myapp.com/people/john/pants"
                    }
                }
            },
            {
                "name":"june",
                "age":23,
                "_links":{
                    "self":{
                        "href":"http://myapp.com/people/june"
                    },
                    "pants":{
                        "href":"http://myapp.com/people/june/pants"
                    }
                }
            }
        ]
    }
}

Допустим, у меня есть куча существующих клиентов, которые я не хочу менять. Есть ли способ отключить гипермедиа-части ответа в некоторых случаях (скажем, Accept="application/json"), но включить их для другие (Accept="hal+json")?

Спасибо!

Обновлено

Итак, к моему огорчению, похоже, то, что я хочу сделать, не поддерживается. Я понимаю, почему SDR сильно склоняется к гипермедиа ... но я не согласен с тем, что предоставление возможности «отключать» гипермедиа на основе заголовка, таким образом предоставляя больше возможностей, - это плохо.

Кроме того, я немного не уверен, как на самом деле добиться этого с помощью моих собственных контроллеров. Если я создам контроллер и попытаюсь переопределить /people RequestMapping с помощью `produces = "application/json", я смогу вернуть "сырой" json с помощью Accept="application/json", но если я передам Accept="application/hal +json» я получаю 406 с «Не удалось найти приемлемое представление». Похоже, что сопоставления ресурсов SDR не сопоставлены с типом контента ... есть предложения?


person Ben M    schedule 21.11.2014    source источник
comment
Да, вы бы сделали это с другим заголовком Accept.   -  person Jonathan W    schedule 22.11.2014
comment
Джонатан, вопрос на самом деле не в том, как узнать, когда вернуть ответ без ненависти, а в том, как включить Spring Data Rest, чтобы он не генерировал элементы Hypermedia в ответе.   -  person Ben M    schedule 24.11.2014
comment
Я считаю, что Spring Data REST использует для этого два разных HttpMessageConverters, и что они находятся в цепочке. Если в заголовке Accept указано application/hal+json, TypeConstrainedMappingJackson2HttpMessageConverter обработает его и создаст HAL. Однако, если заголовок представляет собой только «application/json», срабатывает обычный MappingJackson2HttpMessageConverter, который не будет сериализоваться в HAL. Не уверен, поможет ли это, но я бы попробовал настроить этот последний конвертер, чтобы он не возвращал ссылки на гипермедиа.   -  person Jonathan W    schedule 24.11.2014


Ответы (1)


Короткий ответ: вы не можете использовать spring-data-rest без хейтоаса. Если вы хотите создать свой веб-сервис без ненавистников, вам придется написать свои собственные контроллеры (которые все еще могут использовать репозитории spring-data).

Цитируя Оливера Гирке в этом сообщении SO:

На самом деле вся моя точка зрения такова: сервер просто делает достойный REST. Если это сломает клиент, его нужно исправить (настроить). Таким образом, аспект гипермедиа является фундаментальным для Spring Data REST, и мы не собираемся отказываться от него. Это, вероятно, неудовлетворительно в вашей конкретной ситуации, но должно хотя бы ответить на вопрос :). — Оливер Гирке

person gyoder    schedule 23.11.2014
comment
я удивлен, что вы не можете переопределить конвертер сериализатора/сообщения, чтобы просто не выводить ссылки... похоже, это должно быть возможно - person Chris DaMour; 25.11.2014
comment
Я принял этот ответ, но 7 лет спустя я все еще в корне не согласен с настойчивостью Дротбома в отношении HATEOAS. Я думаю, что время продолжает показывать нам, что с практической точки зрения очень очень очень немногие потребители действительно заинтересованы или могут использовать возможности. - person Ben M; 27.05.2021
comment
Спустя 7 лет я с тобой согласен. :) - person gyoder; 28.05.2021