Удалить (vaadin) оператор сервлета в Spring hateos link

У меня есть подпружиненный проект, который предоставляет @RestController и vaadin @SpringUI.

Доступ к vaadin ui возможен через URL: http://localhost:8080/

Через пользовательский интерфейс пользователи создают устройства. Это создание устройства выполняется путем вызова моего @RestController в моем классе vaadin. Последняя часть - создание устройства. И теперь начинается проблема. У объектов устройств есть элемент Link hateos, инициализированный в его конструкторе. Создание ссылки выполняется с помощью Spring ControllerLinkBuilder.

Проблема в том, что ссылка на hateos создана неправильно. Ссылка выглядит так:

"href": "http://localhost:8080/vaadinServlet/devices/1"

Но ссылка должна выглядеть так (без vaadinServlet):

"href": "http://localhost:8080/devices/1"

RestController для создания новых устройств:

@RestController
@RequestMapping("/devices")
public class DevicesRestController {

    @RequestMapping(value="/{deviceID}", method=RequestMethod.GET)
    @ResponseBody
    public HttpEntity<Device> getDevice(@PathVariable("deviceID") int deviceID) {
        // return device
    }

    @RequestMapping(method=RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Device> postDevice() {
        // return new device
    }
}

Ваадин Ю.И. Создание устройства:

public class VaadinController {

    @Autowired
    private DevicesRestController devicesRestController;

    private Device createDevice() {
        Device postDevice = devicesRestController.postDevice().getBody();
        return postDevice;
    }

}

Класс моего устройства с hateos Ссылка

public class Device {
    private final Link self;

    public Device() {
        this.self = ControllerLinkBuilder.linkTo(DevicesRestController.class).withSelfRel();
    }

}

Короче говоря, как я могу избавиться от /vaadinServlet в моей ссылке hateos, созданной Spring ControllerLinkBuilder?

Редактировать 1: Вы можете решить эту проблему довольно просто, если я не подключу @RestController автоматически в моем VaadinController, просто вызвав класс RestTemplate. Посмотрите следующий фрагмент кода:

public class VaadinController {

    private Device createDevice() {
        RestTemplate rt = new RestTemplate();
        ResponseEntity<Device> postForEntity = rt.postForEntity(new URI("http://localhost:8080/devices/"), <REQUEST_DAT>, Device.class);
        return postForEntity.getBody();
    }

}

Но я думаю, что это не лучшая практика и не очень чистый способ сделать это. Так что мой вопрос все тот же: как удалить эту информацию /vaadinServlet из моей ссылки на hateos?

1 ответ

Прежде всего, не звоните @RestController методы класса из других источников, кроме тестирования.

Vaadin и Spring Hateoas - две разные технологии, не смешивайте их. На самом деле, ваша проблема не имеет никакого отношения к Ваадину. Ссылки Hateoas создаются из текущего запроса. Если текущий запрос обслуживается другим сервлетом, то он наверняка будет содержать URL этого сервлета. У вас есть два варианта здесь:

а) Обработать полученный URL-адрес ссылки: удалить vaadinServlet из него через обработку строк. Это может показаться грязным, но приемлемо, так как ваши намерения не предназначены для hateoas.

б) Не используйте Ваадин для этой задачи. Используйте JavaScript, чтобы вызвать соответствующую конечную точку и показать ее пользователю. Там будут правильные ссылки.

в) Изменить ServletRequestAttributes объект напрямую: RequestContextHolder.setRequestAttributes(requestAttributes) вам может понадобиться сделать магию Java или использовать MockHttpServletRequest,

Мое рекомендуемое решение будет б).

Кстати, ваше решение "edit 1" не является реальным решением, потому что оно связывает приложение с localhost:8080 и игнорирует переменные текущего сеанса, включая (если присутствует) текущего пользователя.

Удачи.

Другие вопросы по тегам