java - Spring 启动: How to pass a command line argument into an annotation value?

标签 java spring spring-boot

这是我正在尝试做的事情:

@SpringBootApplication public class App {
    public static final String NAME;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Autowired public App(ApplicationArguments arguments) {
        NAME = arguments.getSourceArgs()[0]; // ERROR (1)
    }

    @GetMapping("/" + NAME) public void test() { // ERROR (2)
        return NAME;
    }
}

该代码无法按编写的方式工作,因为 (1) 无法分配 NAME,并且 (2) @GetMapping 的注释值必须是常量表达式。

我只想@GetMapping 使用基于命令行参数的值。如何做到这一点?

最佳答案

在第一个请求中。 spring mvc 将初始化资源。所以你把你的动态网址放在haddlermapping中。

我们需要三个类。 MyController MyDispatcherServlet DispatcherServletCustomConfiguration

MyController.java

@Component(value="MyController")
public class MyController {

@Autowired
ClaimService claimService;

public ResponseEntity<HttpStatus> insertClaim() {
    return new ResponseEntity<>(HttpStatus.OK);
    }

}

MyDispatcherServlet.java。在 initStrategies.put 之后,将您的动态 url 放入 handlerMapping 中。

public class MyDispatcherServlet extends DispatcherServlet {

private String url;


public MyDispatcherServlet(String url) {
    super();
    this.url = url;
}


@Override
protected void onRefresh(ApplicationContext context) {
    initStrategies(context);
    List<HandlerMapping> handlerMappings = getHandlerMappings();
    for (HandlerMapping handlerMapping : handlerMappings) {

        if (handlerMapping instanceof RequestMappingHandlerMapping) {
            RequestMappingHandlerMapping requestMappingHandlerMapping = ((RequestMappingHandlerMapping) handlerMapping);
            RequestMappingInfo.Builder n = RequestMappingInfo
                    .paths(url)
                    .methods(RequestMethod.GET);
            try {
                Method method = MyController.class.getDeclaredMethod("insertClaim");
                requestMappingHandlerMapping.registerMapping(n.build(), "MyController", method);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }

        }
    }

}


}

DispatcherServletCustomConfiguration.java

@Configuration
public class DispatcherServletCustomConfiguration {

@Value("${myUrl}")
private String url;

@Bean
public DispatcherServlet dispatcherServlet() {
    return new MyDispatcherServlet(url);
   }

}

使用命令java -jar stackoverflow-1.0-SNAPSHOT.jar --myUrl=abcd运行

关于java - Spring 启动: How to pass a command line argument into an annotation value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56419437/

相关文章:

java - 可变参数和 '...' 参数

java - td border 、 border-bottom 未使用 itext 库以 pdf 格式打印

java - Spring Boot + Intellij Idea + Hibernate - 奇怪的堆栈跟踪

java - Spring Integration DSL SFTP 良好实践

spring - Spring @DirtiesContext 是否重新加载 Spring 上下文?

java - 我如何使用 url 将 list<String> 传递到服务器

java - JSON 路径 "$.name"处没有值,异常 : json can not be null or empty, 使用 Mockmvc 和 Spring-boot

java - Spring Hadoop 配置 - 没有符合条件的 org.apache.hadoop.conf.Configuration 类型的 bean

java - Android 中的 Http cookie 存储

java - catch block 中除以零时不会引发异常