Spring MVC 在Spring中为Controller action生成URL

knsnq2tg  于 8个月前  发布在  Spring
关注(0)|答案(5)|浏览(86)

如何为Controller操作动态创建URL?
考虑以下情况:

@Controller
@RequestMapping("controller")
public class Controller {
    @RequestMapping("url")
    public String method() {
        return "Whatever"
    }
}

我想做的是获取基本URL和concat控制器/URL。对于这种行为,Laravel例如提供了URL helper(action()方法)。Sping Boot 中有类似的东西吗?

dphi5xsq

dphi5xsq1#

你可以使用UriComponentsBuilder来获取当前的url并将附加部分连接到它

@Controller
@RequestMapping("controller")
public class Controller {
    @RequestMapping("url")
    public String method(UriComponentBuilder ucb) {
        URI uri = ucb.path("/url").build().toUri();
        return "Whatever"
    }
}
hgncfbus

hgncfbus2#

Sping Boot framework有一个库。你需要在你的项目中添加它来动态生成链接。下面给出了这个库的gradle依赖。

compile 'org.springframework.boot:spring-boot-starter-hateoas:2.1.4.RELEASE'

我假设你的构建系统是gradle,但如果你使用maven,请使用下面的语法。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>

之后,你可以动态生成链接如下。

WebMvcLinkBuilder.linkTo(Controller.class).slash("url").withSelfRel().getHref();
3okqufwl

3okqufwl3#

基于Tushar的答案,这是我通过名称生成URL的方法,具有一定的合理性,以防止损坏的链接:

import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;

public final class ControllerUtils {

    public static String getActionUrl(Class<?> cls, String name) {
        return WebMvcLinkBuilder.linkTo(cls).slash(name).withSelfRel().getHref();
    }
}
public class MyController {

    public static final String URL_RESULTS = "results";
    
    @PostMapping
    public String handleForm() {
      var nextUrl = ControllerUtils.getActionUrl(this.getClass(), URL_RESULTS);
      response.sendRedirect(nextUrl);
    }

    @GetMapping("/" + URL_RESULTS)
    @ResponseBody
    public String results() { .... }
bjp0bcyl

bjp0bcyl4#

我认为使用@PathVariable会帮助您

@Controller
@RequestMapping(value="/controller")
public class Controller {
    @RequestMapping(value="/url/{id}", method=RequestMethod.GET)
    public String method(@PathVariable("id") String id) {
         System.out.println("the url value : "+id );
        return "Whatever"
    }
}

然后你可以使用/controller/url/{这里是值} example /controller/url/www.google.com调用这个方法

zmeyuzjn

zmeyuzjn5#

如果只想MapController,请使用属性文件
application.properties

server.context-path=/rest

如果您的Controller正在从Repository提供数据,那么Spring Data REST可以删除大部分样板文件并解决您的初始问题。

Spring Data REST

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

可以使用属性文件控制基URL。
application.properties

spring.data.rest.basePath=/rest

这就是你想要的/rest concat控制器/url

相关问题