HATEOAS链接内的自动装配变量

时间:2019-01-30 19:17:09

标签: spring-boot spring-hateoas application.properties

无法解析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
}

我可以进行字符串替换,但是如果有更好的方法或者有人可能遇到相同的问题,请提出建议。谢谢!

2 个答案:

答案 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;
}
}