有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何仅为rest控制器更改基本url?

是否有任何配置选项只允许更改rest控制器的基本url,例如,如果我的api的基本url是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) 个答案

  1. # 1 楼答案

    您应该在应用程序中添加server.servlet-path=/api。属性文件和您应该发送的所有请求,如domain/api/users/{id}

  2. # 2 楼答案

    通常,您会定义一个servlet来处理所有(或特定的一组)restful请求。然后,您会告诉servlet监听一个特定的URL模式,比如/rest。控制器的@RequestMapping注释不知道这种“顶层”模式

    例如,在引导SpringWeb应用程序时,可以手动创建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. # 3 楼答案

    更新了Spring Boot v2的配置。1.0

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

    server.servlet.context-path = /baseApiName

    Complete property configuration list

  4. # 4 楼答案

    选项1:自定义注释

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

    CustomRestControlleran符号。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 {}
    

    firstrest控制器。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:基本控制器

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

    BaseRestController。java

    package com.example.stackoverflow.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @RequestMapping("/rest")
    public class BaseRestController {}
    

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

    firstrest控制器。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数据REST

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

    pom。xml

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

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

    可以通过使用属性文件来控制基本URL

    应用程序。属性

    spring.data.rest.basePath=/rest