如何仅为休息控制器更改基本网址?

时间:2016-07-05 21:03:12

标签: java spring-boot

是否有任何配置选项允许仅为其他控制器更改基本网址,例如,如果我的api的基本网址为www.example.com/user/{id},则成为www.example.com/rest/user/ { id}?

我使用的是spring boot v1.3.2

我尝试创建自定义注释,通过添加RequestMapping扩展RestController。 这是一个例子,但它不起作用。

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@RestController 
@RequestMapping(value = "/rest", path = "/rest") 
public @interface MyRestController { }

4 个答案:

答案 0 :(得分:19)

选项1:自定义注释

创建一个自定义注释,声明基本URL并使用它来代替@RestController。

<强> CustomRestControllerAnnotation.java

package com.example.stackoverflow.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@RestController
@RequestMapping("/rest")
public @interface CustomRestControllerAnnotation {}

<强> FirstRestController.java

package com.example.stackoverflow.controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.example.stackoverflow.config.CustomRestControllerAnnotation;

@CustomRestControllerAnnotation
public class FirstRestController {

    @RequestMapping("/first")
    public String firstMethod(){
        return "First Controller";
    }
}

<强> SecondRestController.java

package com.example.stackoverflow.controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.example.stackoverflow.config.CustomRestControllerAnnotation;

@CustomRestControllerAnnotation
public class SecondRestController {

    @RequestMapping("/second")
    public String secondMethod(){
        return "Second Controller";
    }
}

选项2:Base RestController

通过创建作为所有实际控制器模板的基本控制器,您可以从一个位置有效地管理根URL。

<强> BaseRestController.java

package com.example.stackoverflow.controller;

import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/rest")
public class BaseRestController {}

然后,您只需为所有实际控制器扩展此类。

<强> FirstRestController.java

package com.example.stackoverflow.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FirstRestController extends BaseRestController{

    @RequestMapping("/first")
    public String firstMethod(){
        return "First Controller";
    }
}

<强> SecondRestController.java

package com.example.stackoverflow.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SecondRestController extends BaseRestController{

    @RequestMapping("/second")
    public String secondMethod(){
        return "Second Controller";
    }
}

选项3:Spring Data REST

如果您的控制器正在从存储库提供数据,那么Spring Data REST可以取出大部分样板和文件。解决你最初的问题。

<强>的pom.xml

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

通过声明此依赖关系,您的所有存储库都会自动启用REST。

您可以使用属性文件控制基本URL。

<强> application.properties

spring.data.rest.basePath=/rest

答案 1 :(得分:2)

更新了Spring Boot v2.1.0的配置

在Spring Boot v2.1.0中,您可以在application.properties中配置基本URL,例如

server.servlet.context-path = /baseApiName

Complete property configuration list

答案 2 :(得分:1)

通常,您将定义一个servlet来处理所有(或特定集合)的restful请求。然后,您将告诉该servlet侦听特定的URL模式,如/rest。您的控制器的@RequestMapping注释不会意识到“顶级”&#39;图案。

例如,在引导Spring Web Application时,您可以手动创建该restful servlet并添加映射。整个设置有点太大,无法在此处发布,但请在下方找到一个片段以获得概念。

import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
...

public class WebAppInitializer implements WebApplicationInitializer {

   public void onStartup(ServletContext servletContext) throws ServletException {
     ...
     ServletRegistration.Dynamic restfulServlet = servletContext.addServlet("myServlet", new DispatcherServlet(rootContext));
     restfulServlet.addMapping("/rest/*");
     ...

   }

答案 3 :(得分:-2)

您应该在application.properties文件中添加server.servlet-path=/api以及您应该发送的所有请求,例如domain / api / users / {id}