在 Spring Hateoas 中将链接分解为实体
Disassemble links into entities in Spring Hateoas
也许另一个人偶然发现了这个话题并找到了一个很好的解决方案。在 Spring HATEOAS 项目的帮助下使用 HATEOAS REST 方法非常适合 link 构建资源。但最后,要将扁平化资源映射回实体对象树,我需要拆解我的 link 并查询持久性后端。举个例子,我有一个实体项目,引用项目类型(多对一)。项目的自然键是项目类型外键和项目代码本身的组合。我使用 link 构建器在 ItemController 中映射的 URL 是
@RequestMapping("/catalog/items/{itemTypeCode}_{itemCode}")
现在一个项目的唯一 link 是例如http://www.sample.com/catalog/items/p_abc123
为了反转这个 link 我做了一些非常难看的字符串工作:
@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 控制器,但以某种方式利用调度程序 servlet 反汇编函数将 URL 解构为更方便使用的东西会很好。对我有什么有用的提示吗?非常感谢:)
您可以使用 UriTemplate
。它的 match
方法 returns 从 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"
也许另一个人偶然发现了这个话题并找到了一个很好的解决方案。在 Spring HATEOAS 项目的帮助下使用 HATEOAS REST 方法非常适合 link 构建资源。但最后,要将扁平化资源映射回实体对象树,我需要拆解我的 link 并查询持久性后端。举个例子,我有一个实体项目,引用项目类型(多对一)。项目的自然键是项目类型外键和项目代码本身的组合。我使用 link 构建器在 ItemController 中映射的 URL 是
@RequestMapping("/catalog/items/{itemTypeCode}_{itemCode}")
现在一个项目的唯一 link 是例如http://www.sample.com/catalog/items/p_abc123
为了反转这个 link 我做了一些非常难看的字符串工作:
@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 控制器,但以某种方式利用调度程序 servlet 反汇编函数将 URL 解构为更方便使用的东西会很好。对我有什么有用的提示吗?非常感谢:)
您可以使用 UriTemplate
。它的 match
方法 returns 从 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"