Автосвязанные переменные внутри ссылок HATEOAS - PullRequest
0 голосов
/ 30 января 2019

Невозможно разрешить значение автоматической проводки внутри ссылки Hateoas

http://localhost:8080/${api.version}/api/messages/123

application.properties

api.version=v1

Родительский контроллер Spring

@RequestMapping(value={"${api.version}/api"})
public class BaseRestController {}

Для некоторых контроллеров требуется HATEOAS self link

@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
}

Я могу заменить строку, но если есть способ получше или у кого-то может быть такая же проблема, пожалуйста, предложите.Спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Поскольку я пока не могу найти ответ, сделал простой анализатор 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;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...