Java SpringHateos链接中的Remove(vaadin)servlet语句

Java SpringHateos链接中的Remove(vaadin)servlet语句,java,spring,spring-boot,vaadin,vaadin-spring-boot,Java,Spring,Spring Boot,Vaadin,Vaadin Spring Boot,我有一个SpringBoot项目,它提供了一个@RestController和一个vaadin@SpringUI 可以通过url访问vaadin ui: 用户通过ui创建设备。这个设备创建是通过调用我的vaadin类中的@RestController来完成的。最后一部分是设备的创建。现在问题开始了。设备对象的构造函数中初始化了一个hateos链接成员。链接创建是使用Spring ControllerLinkBuilder完成的 问题是,hateos链接未正确创建。链接如下所示: "href":

我有一个SpringBoot项目,它提供了一个@RestController和一个vaadin@SpringUI

可以通过url访问vaadin ui:

用户通过ui创建设备。这个设备创建是通过调用我的vaadin类中的@RestController来完成的。最后一部分是设备的创建。现在问题开始了。设备对象的构造函数中初始化了一个hateos链接成员。链接创建是使用Spring ControllerLinkBuilder完成的

问题是,hateos链接未正确创建。链接如下所示:

"href": "http://localhost:8080/vaadinServlet/devices/1"
但是链接必须如下所示(没有vaadinServlet):

用于创建新设备的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
    }
}
我的设备类与hateos链接

public class Device {
    private final Link self;

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

}
长话短说:如何在Spring ControllerLinkBuilder创建的hateos链接中去掉/vaadinServlet

编辑1: 如果我不通过调用RestTemplate类在我的VaadinController中自动连接@RestController,您可以很容易地解决这个问题。请参阅以下代码片段:

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();
    }

}
公共类VAADIN控制器{
专用设备createDevice(){
RestTemplate rt=新的RestTemplate();
ResponseEntity postForEntity=rt.postForEntity(新URI(“http://localhost:8080/devices/设备类);
return postForEntity.getBody();
}
}

但我认为这不是最佳实践,也不是一种“不那么干净”的方式。所以我的问题还是一样的:如何删除hateos链接中的/vaadinServlet信息?

首先,除了测试之外,不要从其他地方调用
@RestController
类方法

Vaadin和Spring Hateoas是两种不同的技术,不要混合使用。事实上,你的问题与瓦丁无关。Hateoas链接是根据当前请求创建的。如果当前请求由另一个servlet服务,那么它肯定会包含该servlet的url。这里有两个选项:

a) 处理接收到的链接url:通过字符串处理从中删除
vaadinServlet
。这可能看起来很混乱,但可以接受,因为你的意图不是hateoas设计的目的

b) 不要使用Vaadin完成此任务。使用JavaScript调用适当的端点并将其显示给用户。它将有正确的链接

c) 直接修改
ServletRequestAttributes
对象:
RequestContextHolder.setRequestAttributes(requestAttributes)
您可能需要执行一些java魔术或使用
MockHttpServletRequest

我建议的解决方案是b)

顺便说一下,您的“编辑1”解决方案不是真正的解决方案,因为它将应用程序耦合到localhost:8080,并忽略当前会话变量,包括(如果存在)当前用户

祝你好运

public class Device {
    private final Link self;

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

}
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();
    }

}