gpt4 book ai didi

spring-boot - 如何将 Picocli 解析参数注入(inject) Spring Bean 定义?

转载 作者:行者123 更新时间:2023-12-04 14:17:21 24 4
gpt4 key购买 nike

我正在尝试使用 Picocli使用 Spring Boot 2.2 将命令行参数传递给 Spring Bean,但不确定如何构造它。例如,我有以下 @Command从命令行指定连接用户名和密码,但是,想要使用这些参数来定义一个 Bean:

@Component
@CommandLine.Command
public class ClearJdoCommand extends HelpAwarePicocliCommand {
@CommandLine.Option(names={"-u", "--username"}, description = "Username to connect to MQ")
String username;

@CommandLine.Option(names={"-p", "--password"}, description = "Password to connect to MQ")
String password;

@Autowired
JMSMessagePublisherBean jmsMessagePublisher;

@Override
public void run() {
super.run();
jmsMessagePublisher.publishMessage( "Test Message");
}
}


@Configuration
public class Config {
@Bean
public InitialContext getJndiContext() throws NamingException {
// Set up the namingContext for the JNDI lookup
final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
env.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
return new InitialContext(env);
}

@Bean
public JMSPublisherBean getJmsPublisher(InitialContext ctx){
return new JMSPublisherBean(ctx);
}
}
我在这里陷入了一个循环。我需要命令行用户名/密码来实例化我的 JMSPublisherBean,但这些仅在运行时可用,在启动时不可用。
我设法通过使用延迟初始化,注入(inject) ClearJdoCommand 来解决这个问题。 bean 进入配置 bean 并在我的 run() 中检索 JMSPublisherBean从 Spring 上下文来看,但这似乎是一个丑陋的黑客。此外,它迫使我所有的 bean 都懒惰,这不是我的偏好。
是否有另一种/更好的方法来实现这一目标?

最佳答案

第二种选择可能是使用纯 PicoCli(不是 PicoCli spring boot starter)并让它运行命令;命令不会是 Spring bean,只会用于验证参数。
在其 call方法,Command将创建 SpringApplication , 用属性填充它(通过 setDefaultProperties 或使用 JVM System.setProperty - 不同之处在于环境变量将覆盖默认属性,而系统属性具有更高的优先级)。

  @Override
public Integer call() {
var application = new SpringApplication(MySpringConfiguration.class);
application.setBannerMode(Mode.OFF);
System.setProperty("my.property.first", propertyFirst);
System.setProperty("my.property.second", propertySecond);
try (var context = application.run()) {
var myBean = context.getBean(MyBean.class);
myBean.run(propertyThird);
}
return 0;
}
这样,PicoCli 将验证输入、提供帮助等,但您可以控制 Spring Boot 应用程序的配置。您甚至可以为不同的命令使用不同的 Spring 配置。我相信这种方法比将所有属性传递给 CommandLineRunner 更自然。在 Spring 容器中

关于spring-boot - 如何将 Picocli 解析参数注入(inject) Spring Bean 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58946730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com