2015-05-08 34 views
1

如何通過JobParameters查詢MongoItemReader彈簧批| | MongoItemReader |如何將JobParameters傳遞給mongo查詢?

我ItemReader樣子: -

@Bean 
public ItemReader<Person> PersonTenantBasedItemReader() { 
    MongoItemReader<Person> reader = new MongoItemReader<Person>(); 
    reader.setTemplate(mongoTemplate); 
    reader.setTargetType((Class<? extends Person>) Person.class); 
    reader.setQuery("{status:'XYZ',nextCheckpointDate:{$gte:?fromDate,$lte:?toDate}"); // !!!!I want to pass fromDate and toDate as job parameters. !!!!  
    Map<String, Direction> sorts = new HashMap<String, Sort.Direction>(1); 
    sorts.put("status", Sort.Direction.ASC); 
    reader.setSort(sorts); 
    return reader; 
} 

這是怎麼了開展工作: -

@Test 
public void test() throws Exception { 
    Map<String, JobParameter> map = new HashMap<String, JobParameter>(2); 
    map.put("fromDate", new JobParameter(new Date())); 
    map.put("toDate", new JobParameter(//some future date comes here); 
    JobParameters jobParameters = new JobParameters(map); 
    JobExecution run = launcher.run(job, jobParameters); 
    Assert.assertNotNull(run); 
} 

我得到這個異常: -

com.mongodb.util.JSONParseException: 
{status:'DELINQUENT',nextCheckpointDate:{$gte:?fromDate,$lte:?toDate} 
              ^
    at com.mongodb.util.JSONParser.parse(JSON.java:216) 
    at com.mongodb.util.JSONParser.parseObject(JSON.java:249) 
    at com.mongodb.util.JSONParser.parse(JSON.java:213) 
    at com.mongodb.util.JSONParser.parseObject(JSON.java:249) 
    at com.mongodb.util.JSONParser.parse(JSON.java:213) 
    at com.mongodb.util.JSONParser.parse(JSON.java:163) 
    at com.mongodb.util.JSON.parse(JSON.java:99) 
    at com.mongodb.util.JSON.parse(JSON.java:79) 
    at org.springframework.data.mongodb.core.query.BasicQuery.<init>(BasicQuery.java:39) 
    at org.springframework.batch.item.data.MongoItemReader.doPageRead(MongoItemReader.java:176) 
    at org.springframework.batch.item.data.AbstractPaginatedDataItemReader.doRead(AbstractPaginatedDataItemReader.java:59) 
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:88) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155) 
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114) 
+0

與@Value綁定PersonTenantBasedItemReader()參數( 「#{jobParameters []}」)標註 –

+0

@LucaBassoRicci可以請你詳細說明一些代碼/例子? –

回答

2

兩個問題我看到你的配置:

  1. 爲了注入JobParameter值,您需要使用步驟範圍。您的bean當前使用單例作用域(默認)進行配置。
  2. 您實際上並沒有將參數注入到您的方法中。

給下面的一個嘗試:

@Bean 
@StepScope 
public MongoItemReader<Person> PersonTenantBasedItemReader(@Value("#{jobParameters[fromDate]}") String fromDate, @Value("#{jobParameters[toDate]}") String toDate) { 
    MongoItemReader<Person> reader = new MongoItemReader<Person>(); 
    reader.setTemplate(mongoTemplate); 
    reader.setTargetType((Class<? extends Person>) Person.class); 
    reader.setQuery(String.format("{status:'XYZ',nextCheckpointDate:{ %s ? %s }", fromDate, toDate)); 
    Map<String, Direction> sorts = new HashMap<String, Sort.Direction>(1); 
    sorts.put("status", Sort.Direction.ASC); 
    reader.setSort(sorts); 
    return reader; 
} 
+0

你能分享XML代碼嗎? –

0
List<Object> param = new ArrayList<Object>(); 
param.add(fromDate); 
param.add(toDate) 
reader.setQuery("{status:'XYZ',nextCheckpointDate:{$gte:?0,$lte:?1}"); 
+1

歡迎來到Stack Overflow!儘管這段代碼可以解決這個問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – jmattheis

相關問題