将链接拆解为Spring Hateoas中的实体

Mar*_*idt 5 spring-mvc spring-hateoas spring-boot

也许另一个人偶然发现了这个话题并找到了一个很好的解决方案.在Spring HATEOAS项目的帮助下使用HATEOAS REST方法可以很好地将链接构建到资源.但最后,为了将扁平化资源映射回实体对象树,我需要反汇编链接并查询持久性后端.给出示例,我有一个实体Item,引用ItemType(多对一).item的自然键是ItemType外键和Item代码本身的组合.我使用链接构建器在ItemController中映射的URL是

@RequestMapping("/catalog/items/{itemTypeCode}_{itemCode}")
Run Code Online (Sandbox Code Playgroud)

现在,项目的唯一链接是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;
}
Run Code Online (Sandbox Code Playgroud)

而且我一直在想,如果没有更好的和更灵活的方法(小心任何查询字符串部分,这将打破代码)来做这个逆映射.我实际上不想从控制器中调用另一个MVC控制器,但它会很好,以某种方式利用调度程序servlet反汇编函数将URL解构为更方便使用的东西.对我有什么有用的提示?多谢 :)

And*_*son 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"
Run Code Online (Sandbox Code Playgroud)