无法解析Hateoas链接中的自动装配值
http://localhost:8080/${api.version}/api/messages/123
application.properties
api.version=v1
Spring父控制器
@RequestMapping(value={"${api.version}/api"})
public class BaseRestController {}
某些控制器需要HATEOAS自链接
@RestController
public class SomeController extends BaseRestController {
// constructor
@RequestMapping(value = "/messages/{messageId}", method = RequestMethod.GET)
public ResponseEntity<Alert> getAlert(@PathVariable("messageId") String messageId) {
Link selfLink = linkTo(methodOn(SomeController.class).getAlert(messageId, null)).withSelfRel();
System.out.println(selfLink.getHref());
// more code
}
我可以进行字符串替换,但是如果有更好的方法或者有人可能遇到相同的问题,请提出建议。谢谢!
答案 0 :(得分:1)
我在实施和创建一些 Spring Boot 项目时实际上遇到了同样的问题。似乎 Spring HATEOAS WebMvcLinkBuilder 将在通过 application.properties 中的值注入之前获取在控制器类的 URI 映射上分配的文本字符串。据我了解,我怀疑 HATEOAS WebMvcLinkBuilder 不依赖于控制器 bean 的映射 URI 的注入值,而是依赖于原始文本字符串本身。
我只使用了 Spring 操作和 Link withHref 和 getHref 方法。
@Value(API_VERSION)
private String apiVersion;
//inside a method
Link link = linkTo(methodOn(SomeController.class).getAlert(messageId, null)).withSelfRel();
link.withHref(link.getHref().replace("${api.version}", urlBrand));
答案 1 :(得分:0)
到目前为止,我还没有找到答案,因此做了简单的URL解析器:
application.properties
api.version=v1
资源汇编器
@Component
public class AlertResourceAssembler implements ResourceAssembler<Alert, Resource<Alert>> {
public static final String API_VERSION = "${api.version}";
@Value(API_VERSION)
private String apiVersion;
@Override
public Resource toResource(Alert alert) {
String messageId = alert.getMessageId();
Resource<Alert> resource = new Resource<>(alert);
resource.add(createLink(Link.REL_SELF, linkTo(methodOn(SomeController .class).getAlert(messageId, null))).withSelfRel());
resource.add(createLink("comments", linkTo(methodOn(SomeController .class).getUserComments(messageId, null))));
return resource;
}
private Link createLink(String rel, ControllerLinkBuilder linkBuilder) {
final Map<String, String> urlParameters = createParams();
String href = linkBuilder.withSelfRel().getHref();
for (Map.Entry<String, String> entry : urlParameters.entrySet()) {
href = href.replace(entry.getKey(), entry.getValue());
}
return new Link(href, rel);
}
private Map<String, String> createParams() {
Map<String, String> parameters = new HashMap<>();
parameters.put(API_VERSION, "/" + apiVersion);
return parameters;
}
}