springboot如何动态添加controller层的getmapping映射?

在 Spring Boot 中,可以使用 Spring 的RequestMappingHandlerMapping来动态添加@GetMapping映射,以下是具体步骤:

注入 RequestMappingHandlerMapping

首先,需要在相关的类中注入RequestMappingHandlerMapping,它负责处理请求映射。示例代码如下:

 

java
 
 
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DynamicMappingHandler {

    @Autowired
    private RequestMappingHandlerMapping requestMappingHandlerMapping;
}
 

创建处理方法

创建一个用于处理请求的方法,该方法将作为动态添加的@GetMapping映射的处理逻辑。示例代码如下:

 

java
 
 
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@Component
public class DynamicMappingHandler {

    @Autowired
    private RequestMappingHandlerMapping requestMappingHandlerMapping;

    // 处理动态映射的方法
    @ResponseBody
    public ResponseEntity<String> dynamicMappingHandler() {
        return new ResponseEntity<>("This is a dynamic mapping response", HttpStatus.OK);
    }
}
 

动态添加映射

使用RequestMappingHandlerMappingregisterMapping方法来动态添加@GetMapping映射。示例代码如下:

 

java
 
 
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@Component
public class DynamicMappingHandler {

    @Autowired
    private RequestMappingHandlerMapping requestMappingHandlerMapping;

    // 处理动态映射的方法
    @ResponseBody
    public ResponseEntity<String> dynamicMappingHandler() {
        return new ResponseEntity<>("This is a dynamic mapping response", HttpStatus.OK);
    }

    // 动态添加映射
    @PostConstruct
    public void addDynamicMapping() {
        // 创建RequestMappingInfo
        RequestMappingInfo requestMappingInfo = RequestMappingInfo
               .paths("/dynamic")
               .methods(RequestMethod.GET)
               .build();

        // 注册映射
        requestMappingHandlerMapping.registerMapping(requestMappingInfo, this, "dynamicMappingHandler");
    }
}
 

 

在上述代码中,@PostConstruct注解的方法在 Bean 初始化后会被调用,在这个方法中,首先创建了一个RequestMappingInfo对象,它定义了请求的路径/dynamic和请求方法GET,然后使用registerMapping方法将这个映射注册到RequestMappingHandlerMapping中,关联到dynamicMappingHandler方法。
posted @ 2025-05-08 14:35  CharyGao  阅读(45)  评论(0)    收藏  举报