gpt4 book ai didi

java - 删除 Spring hatoas 链接中的 (vaadin) servlet 语句

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:53 26 4
gpt4 key购买 nike

我有一个 spring-boot 项目,它提供了 @RestController 和 vaadin @SpringUI。

可以通过 url 访问 vaadin ui:http://localhost:8080/

通过ui用户创 build 备。此设备创建是通过在我的 vaadin 类中调用我的 @RestController 来完成的。最后一部分是设备的创建。现在开始问题了。设备对象有一个在其构造函数中初始化的 hatos Link 成员。链接创建是使用 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
}
}

Vaadin UI 创 build 备:

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

}

长话短说:如何摆脱 Spring ControllerLinkBuilder 创建的 hatos 链接中的/vaadinServlet?

编辑 1:如果我不通过调用 RestTemplate 类来 Autowiring 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();
}

}

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

最佳答案

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

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

a) 处理接收到的链接 url:通过字符串处理从中删除 vaadinServlet。这可能看起来很困惑,但可以接受,因为您的意图不是 hatoas 的设计方式。

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

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

我推荐的解决方案是b)

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

祝你好运。

关于java - 删除 Spring hatoas 链接中的 (vaadin) servlet 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36842999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com