2015-02-17 3 views
4

, возможно, еще один наткнулся на эту тему и нашел приятное решение. Использование подхода HATEOAS REST с помощью проекта Spring HATEOAS очень хорошо работает для построения ссылок на ресурсы. Но в конце концов, чтобы сопоставить сплющенные ресурсы обратно к дереву объектов сущности, мне нужно разобрать мою ссылку и запросить поддержку. Приведенный пример, у меня есть объект Item, ссылающийся на ItemType (много-к-одному). Естественным ключом элемента является совокупность внешнего ключа ItemType и самого кода элемента. URL-адрес карты в ItemController с помощью компоновщика ссылок:Разберите ссылки на объекты весной Hateoas

@RequestMapping("/catalog/items/{itemTypeCode}_{itemCode}") 

Теперь уникальная ссылка на элемент, например. http://www.sample.com/catalog/items/p_abc123

Чтобы инвертировать эту ссылку я сделать некоторые очень некрасиво струнный работы:

@Override 
public Item fromLink(Link link) { 
    Assert.notNull(link); 
    String baseLink = linkTo(ColorTypeController.class).toString() + "/"; 
    String itemTypeAndItemPart = link.getHref().replace(baseLink, ""); 
    int indexOfSplit = itemTypeAndItemPart.indexOf('_'); 
    ItemType itemType = new ItemType(); 
    itemType.setCode(itemTypeAndItemPart.substring(0, indexOfSplit)); 
    Item item = new Item(); 
    item.setItemType(itemType); 
    item.setCode(itemTypeAndItemPart.substring(indexOfSplit + 1)); 
    return item; 
} 

И все время я задаюсь вопросом, если есть не намного лучше и более гибкий подход (остерегайтесь строки запроса часть, которая сломает код), чтобы сделать это обратное отображение. На самом деле я не хочу вызывать другого контроллера MVC из контроллера, но было бы неплохо, чтобы каким-то образом использовать функции демонтажа сервлетов диспетчера для деконструирования URL-адреса в нечто более удобное для работы. Какие-нибудь полезные подсказки для меня? Thx alot :)

ответ

6

Вы можете использовать UriTemplate. Его метод match возвращает карту переменных и их значения, которые были извлечены из URI. Например:

UriTemplate uriTemplate = new UriTemplate("/catalog/items/{itemTypeCode}_{itemCode}"); 
Map<String, String> variables = uriTemplate.match("http://www.sample.com/catalog/items/p_abc123"); 
String itemTypeCode = variables.get("itemTypeCode"); // "p" 
String itemCode = variables.get("itemCode"); // "abc123" 
+0

Спасибо, Энди, что работает :) –

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