如何在Spring配置中访问命令行参数?

时间:2016-01-15 20:44:38

标签: java spring spring-boot spring-integration

我有一个Spring Boot应用程序,它使用Spring Integration存储过程入站通道适配器。我想将命令行参数传递给存储过程。 Spring Boot文档说SpringApplication会将任何以' - '开头的命令行选项参数转换为属性并将其添加到Spring Environment。在int-jdbc:parameter元素中访问此属性的正确方法是什么?

Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext ctx = new SpringApplication("integration.xml").run(args);
        System.out.println("Hit Enter to terminate");
        System.in.read();
        ctx.close();
    }    
}

integration.xml

<int-jdbc:stored-proc-inbound-channel-adapter
    stored-procedure-name="sp_get_some_records"
    data-source="dataSource"
    channel="recs.in.channel"
    id="recs.in">

    <int:poller fixed-rate="86400" time-unit="SECONDS" />

    <int-jdbc:parameter name="myarg" type="java.lang.Integer" value="${arg1}" />

</int-jdbc:stored-proc-inbound-channel-adapter>

在这里使用${arg1}似乎无法解决。什么是正确的语法,还是需要定义其他属性或属性占位符?

启动应用,例如使用java -jar app.jar --arg1=5抛出

的例外
Error converting typed String value for bean property 'value'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type [java.lang.String] to required type [java.lang.Integer]; nested exception is java.lang.NumberFormatException: For input string: "${arg1}"

我首先想到的是它与类型转换有关并尝试使用

<int-jdbc:parameter name="myarg" type="java.lang.Integer" value="#{ T(java.lang.Integer).parseInt(arg1) }" />

但这也不起作用。

2 个答案:

答案 0 :(得分:2)

你没有任何Spring Boot的东西。

我的意思是auto-configuration,其中也包括PropertyPlaceholderConfigurer

那一定是这样的:

@SpringBootApplication
@ImportResource("integration.xml")
public class Application {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
        System.out.println("Hit Enter to terminate");
        System.in.read();
        ctx.close();
    }    
}

我刚刚查看了barrier示例:https://github.com/spring-projects/spring-integration-samples/tree/master/basic/barrier

答案 1 :(得分:1)

如果我是你,我会将你的XML配置转换为JavaConfig。然后,您可以使用

访问配置类中的属性
@Value("${arg1}")
private Integer arg1;