【问题标题】:how to pass dynamic variable to XML in Spring Batch如何在 Spring Batch 中将动态变量传递给 XML
【发布时间】:2017-02-23 13:02:43
【问题描述】:

我在 XML 文件中编写了以下查询并希望从 java 代码传递 created_date 的动态值,我正在创建 spring 批处理程序。那么该怎么做呢?

    <property name="dataSource" ref="dataSource" />

    <property name="sql"
        value="SELECT `txn`.`id`,
                    `txn`.`sender_id`,
                    `txn`.`beneficiary_id`,
                    `txn`.`amount`,
                    `txn`.`pay_mode_master_id`,
                    `txn`.`status`,
                    `txn`.`reference_number`,
                    `txn`.`created_by`,
                    `txn`.`created_date`,
                    `txn`.`updated_by`,
                    `txn`.`updated_date`,
                    `txn`.`source_currency_master_id`,
                    `txn`.`dest_currency_master_id`,
                    `txn`.`fees`,
                    `txn`.`exchange_rate`,
                    `txn`.`total_amount`,
                    `txn`.`recipient_gets`,
                    `txn`.`from_country`,
                    `txn`.`to_country`,
                    `txn`.`other_purpose`,
                    `txn`.`transaction_purpose_id`,
                    `txn`.`sender_account_id`,
                    `txn`.`transaction_number`,
                    `txn`.`source_region`,
                    `txn`.`error`,
                    `txn`.`corridor_id`,
                    `txn`.`promo_code`,
                    `txn`.`receiver_id`,
                    `txn`.`error_code`
                FROM `remittance`.`transaction_master` txn where txn.created_date >= '2017-02-09 00:00:00' AND txn.created_date <='2017-02-09 23:59:59';" />

    <property name="rowMapper">
        <bean class="com.websystique.springbatch.ExamResultRowMapper" />
    </property>
</bean>

【问题讨论】:

    标签: java xml xml-parsing spring-batch


    【解决方案1】:

    由于您在xml 文件中编写查询,所以我认为您可以解析并获取原始查询字符串。之后,您可以通过以下方式简单地从 java 代码中传递动态值。

    代码:

    List<Date> parameters = new ArrayList<>();
    /* Here add all dates to the parameter ArrayList */
    String query = "SELECT `txn`.`id`,
                        `txn`.`sender_id`,
                        `txn`.`beneficiary_id`,
                        `txn`.`amount`,
                        `txn`.`pay_mode_master_id`,
                        `txn`.`status`,
                        `txn`.`reference_number`,
                        `txn`.`created_by`,
                        `txn`.`created_date`,
                        `txn`.`updated_by`,
                        `txn`.`updated_date`,
                        `txn`.`source_currency_master_id`,
                        `txn`.`dest_currency_master_id`,
                        `txn`.`fees`,
                        `txn`.`exchange_rate`,
                        `txn`.`total_amount`,
                        `txn`.`recipient_gets`,
                        `txn`.`from_country`,
                        `txn`.`to_country`,
                        `txn`.`other_purpose`,
                        `txn`.`transaction_purpose_id`,
                        `txn`.`sender_account_id`,
                        `txn`.`transaction_number`,
                        `txn`.`source_region`,
                        `txn`.`error`,
                        `txn`.`corridor_id`,
                        `txn`.`promo_code`,
                        `txn`.`receiver_id`,
                        `txn`.`error_code`
                    FROM `remittance`.`transaction_master` txn where txn.created_date >= :created_date AND txn.created_date <=:created_date";
    /* call addDynamicDateToQuery using the class object in which your 
    addDynamicDateToQuery method is present */
    query = addDynamicDateToQuery(query ,"created_date",parameters);
    
    public static String addDynamicDateToQuery(String query, String token,
                Collection data) {
            if(data.isEmpty() || !query.contains(":")){
                query = null;
            }else{
                StringBuffer clause = new StringBuffer("");
                for(Object value : data){
                    if(value instanceof Date){
                        clause.append(value + ",");
                    }
                }
                String clauseStr = clause.toString();
                clauseStr = clauseStr.substring(0,clauseStr.lastIndexOf(","));
                query = query.replace(":" + token, clauseStr);
            }
            return query;
        }
    
    /* Now You can call this query using JdbcTemplate object */
    

    【讨论】:

    • 但我想将整个查询放在 XML 中,但参数应该从 java 代码动态传递并希望将该查询用于 spring 批处理作业。
    【解决方案2】:

    我得到了解决方案,以下是我需要在调用作业的 java 文件中进行的代码更改..

    JobParameters param = new JobParametersBuilder().addString("createdDate", "'%2017-02-24%'").toJobParameters();
    JobExecution execution = jobLauncher.run(job, param);
    

    & 在 xml 文件中... FROM `remittance`.`transaction_master` txn where txn.created_date like #{jobParameters['createdDate']};" />

    而且你必须把 scope="step" 放到 bean 标签中。否则会报错。

    您可以输入多个参数,例如:

    JobParameters param = new JobParametersBuilder().addString("targetPath", targetPath).addString("sourceFile", sourceFile).toJobParameters();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2013-07-07
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多