当前位置: 首页 > 知识库问答 >
问题:

基本路径没有出现在资源处理器自定义链接中

韩捷
2023-03-14

在Spring数据REST中,我使用资源处理器创建自定义链接:

@Component
public class ServiceInstanceProcessor
        implements ResourceProcessor<Resource<ServiceInstance>> {

    @Override
    public Resource<ServiceInstance> process(Resource<ServiceInstance> resource) {
        Long id = resource.getContent().getId();
        ServiceInstanceController controller =
                methodOn(ServiceInstanceController.class);

        resource.add(linkTo(controller.getNodeSummary(id))
                .withRel("nodeSummary"));
        resource.add(linkTo(controller.getHealthBreakdown(id))
                .withRel("healthBreakdown"));
        resource.add(linkTo(controller.getRotationBreakdown(id))
                .withRel("rotationBreakdown"));
        return resource;
    }
}

然而,即使我已将控制器标记为@BasePathAwareController,并且即使默认链接包含基本路径,生成的链接也不包括基本路径:

{
  ...

  "_links" : {
  "self" : {
    "href" : "http://localhost:8080/api/serviceInstances/101"
  },
  "serviceInstance" : {
    "href" : "http://localhost:8080/api/serviceInstances/101{?projection}",
    "templated" : true
  },
  "nodeSummary" : {
    "href" : "http://localhost:8080/serviceInstances/101/nodeSummary"
  },
  "healthBreakdown" : {
    "href" : "http://localhost:8080/serviceInstances/101/healthBreakdown"
  },
  "rotationBreakdown" : {
    "href" : "http://localhost:8080/serviceInstances/101/rotationBreakdown"
  },

  ...
}

}

我还需要做什么才能让基本路径出现在链接中?

共有1个答案

壤驷凯
2023-03-14

我认为这与错误控制器有关,LinkBuilder没有考虑Spring Data REST的基本路径,并且自定义控制器更改的基本路径没有显示在HAL中

作为解决方法,我接下来要做:

@Autowired
private final RepositoryRestConfiguration config;

private Link fixLinkSelf(Object invocationValue) {
    return fixLinkTo(invocationValue).withSelfRel();
}

@SneakyThrows
private Link fixLinkTo(Object invocationValue) {
    UriComponentsBuilder uriComponentsBuilder = linkTo(invocationValue).toUriComponentsBuilder();
    URL url = new URL(uriComponentsBuilder.toUriString());
    uriComponentsBuilder.replacePath(config.getBasePath() + url.getPath());
    return new Link(uriComponentsBuilder.toUriString());
}

用法与< code>linkTo相同:

resources.add(fixLinkSelf(methodOn(VoteController.class).history()));    
resources.add(fixLinkTo(methodOn(VoteController.class).current()).withRel("current"));

基于当前addPath请求的简单情况的其他解决方法:

new Link(ServletUriComponentsBuilder.fromCurrentRequest().path(addPath).build().toUriString())
 类似资料:
  • 我使用的是Spring Boot 1.3.3和swagger springmvc:1.0.2。我正在将应用程序的基本路径设置为“/”。而斯威格正在 http://localhost:9000/swagger/index.html 我需要更改它,但将应用程序的根目录保留为“/”。我需要写一条规则,比如: 如果有人打http://localhost:9000/SOMETHING/swagger/ind

  • 默认情况下,vue-loader 使用 css-loader 和 Vue 模版编译器自动处理样式和模版文件。在编译过程中,所有的资源路径例如 <img src="...">、background: url(...) 和 @import 会作为模块依赖。 例如,url(./image.png) 会被转换为 require('./image.png'),而 <img src="../image.png

  • 当 Vue Loader 编译单文件组件中的 <template> 块时,它也会将所有遇到的资源 URL 转换为 webpack 模块请求。 例如,下面的模板代码片段: <img src="../image.png"> 将会被编译成为: createElement('img', { attrs: { src: require('../image.png') // 现在这是一个模块的请

  • 我正在通过数据库开发一组rest资源,并使用Spring Data Rest公开核心CRUD功能,以直接与存储库交互。 在我的简化示例中,我有以下用户: 和用户自己的项目: 直接与存储库交互是可以的,所以对于创建用户(其他简单实体),问题来自于创建项目。项目有大量基于用户表单输入的服务器派生字段,所以我编写了一个自定义控制器来生成它们并保存结果。为了持久化结果,我需要将项目与其拥有的用户相关联。我

  • 问题内容: 我目前正在开发一个Spring Batch,它可以在第一步中将Excel(.xsls)文件转换为CSV,然后读取CSV,对其进行处理并将其数据存储在数据库中。第一步效果很好。批处理在第二步停止,并发出以下警告:。在我的代码之后: spring-config.xml: 第1步-convertXLSXtoCVS.java: 我在属性文件中提到了文件路径,如下所示: 当我在阅读器定义中从sp

  • 本文将介绍 Weex 中 uri(url) 的用法。包括使用图像、字体等资源,处理相对路径以及如何访问本地及打包的资源文件。 Schemes 本地资源 Weex SDK 提供 local scheme 来访问打包在应用程序中的资源,此 scheme 无法在 H5 环境下使用。目前,开发者可以在 image 组件和字体文件中使用本地资源。 在 iOS 中,Weex 会在 bundle resourc