2015-04-10 6 views
9

Одна вещь, которую я не понимаю, при использовании ControllerLinkBuilder с methodOn особенностью является то, что вы предположим делать, если ваш контроллер имеет сигнатуру метода, как так:Spring HATEOAS ControllerLinkBuilder с methodOn

public HttpEntity<ResourceSupport> update(@PathVariable(USER_ID) Long userId, @Valid @RequestBody UserUpdateRequest userUpdateRequest, BindingResult bindingResult) 

Поэтому, когда я хотите использовать methodOn, как я должен заполнить пробелы, такие как UserUpdateRequest аргумент и BindingResult (Я использую результат привязки для обработки исключений с ошибками с помощью @Controller Совет и JSR 303, чтобы сделать выводные сообщения доступными для человека).

Когда я хочу использовать из коробки весной HATEOAS ControllerLinkBuilder для большей легкости с methodOn я заканчиваю писать что-то вроде этого (против меня, я не знаю, если это не будет иметь обратный эффект, но код не выглядит утешительно):

resource.add(linkTo(methodOn(UserController.class).update(userId, null, null)).withSelfRel()); 

Ofcourse можно опустить methodOn часть и использовать только linkTo который затем требует, чтобы я играл вокруг построения пути.

Уместно просто передать null refs? Кроме того, как это удобно, используя methodOn как если вы решите удалить слово: BindingResult или добавить что-то вроде HttpServletRequest к методу контроллера подписи так, что пружина может передать мне более подробную информацию о запросе, если бы я хотел, чтобы войти в IP-адрес по какой-то причине. Это потребовало бы, чтобы я пошел и изменил конструкцию элемента связи с помощью метода OO.

Другого вопрос, который немного ошеломляет меня, говорит, я прохожу законный реф в methodOn как userUpdateRequest заполнены данными - это, что данные предполагают, чтобы пойти куда-нибудь с сгенерированной ссылкой? Я видел некоторые Hypermedia, которые включают наряду с rel и href тело того, что вы передаете, - возможно ли это с Spring HATEOAS, и является ли хорошей практикой создавать ссылки с готовыми к отправке/размещению в них полезных нагрузок?

Но вернемся к ControllerLinkBuilder с использованием только linkTo метод строительства связей с .slash ("...") - это потенциально менее требует дорогостоящего технического обслуживания?

В повседневной практике, что бы вы порекомендовали и что вы думаете о строительстве ссылок? Может быть, кто-то может предоставить профессиональные советы/советы.

Спасибо,

ответ

4

Если параметр не требуется для создания пути вы можете спокойно пройти null к methodOn. Вы можете передавать «реальные» данные, так как фактически используются данные, необходимые для создания пути.

methodOn - обоюдоострый меч. С одной стороны, это избавляет вас от создания ссылок вручную. Таким образом, ошибок не будет, и если вы измените путь, все ссылки будут по-прежнему правильными.С другой стороны, вы почти наверняка никогда не измените путь, но, как вы заметили, вы можете изменить подпись метода. В этом случае вам также придется обновить код построения ссылок, потому что он не будет компилироваться в противном случае. Вы не можете забыть об обновлении, так что это хорошо. Тем не менее, рассмотрим следующие изменения:

update(@ModelAttribute Integer otherId, 
     @PathVariable(USER_ID) Long userId, 
     @Valid @RequestBody UserUpdateRequest) 

methodOn(UserController.class).update(userId, null, null) все еще был бы семантически правильно, так что вы не получите ошибку компиляции. Однако создание ссылки не получится.

ИМХО лучший способ - максимально использовать автоматическое построение ссылок, как это сделано Spring Data REST. Ваш API должен быть простым и достаточно последовательным, чтобы извлекать хотя бы большую часть кода создания ссылок. Затем связь будет строиться с использованием slash(), а не methodOn.

Что касается включения корпуса: формат по умолчанию Spring HATEOAS равен HAL. Для предоставления таких данных используется свойство _embedded.