【发布时间】:2017-01-23 21:41:06
【问题描述】:
在我的 Spring Batch 作业中,第一步是从 REST 服务读取 JSON 数据并将其写入本地 HSQL 表以供以后处理。
我对@987654321@ 的调用确实得到了预期的JSON,它确实将JSON 转换为List<SampleItem>。
然而,奇怪的是,列表中的SampleItem 对象没有设置任何属性。好像MappingJackson2HttpMessageConverter 没有找到bean 属性?
工作定义:
<batch:job id="samples_results.job" restartable="false">
<batch:step id="get.samples" next="get.results">
<batch:tasklet>
<!-- 1. HERDS survey data about outlet samples so far. Form #1 -->
<batch:chunk reader="samples.rest.item.reader" writer="samples.hsqldb.item.writer" commit-interval="${commit.interval}"/>
</batch:tasklet>
</batch:step>
...
<batch:listeners>
<batch:listener ref="job.listener"/>
</batch:listeners>
<batch:validator ref="job.parameters.validator"/>
</batch:job>
<beans:bean id="samples.rest.item.reader" class="gov.ny.health.adsg.ceh.slrs_hdny.SamplesRestItemReader">
<beans:property name="activityId" value="${samples.activity.id}"/>
<beans:property name="formId" value="${samples.form.id}"/>
<beans:property name="username" value="${herds.uname}"/>
<beans:property name="password" value="${herds.password}"/>
</beans:bean>
<beans:bean id="samples.hsqldb.item.writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="sql">
<beans:value><![CDATA[insert into t_sample(org_id, name, address) values (:ORG_ID, :ORG_NAME, :ADDRESS_1)]]></beans:value>
</beans:property>
<beans:property name="itemSqlParameterSourceProvider">
<beans:bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
</beans:property>
</beans:bean>
相关的ItemReader 代码,成功返回List<SampleItem>,其中包含一个项目(但没有在该项目上设置属性):
try {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
headers.set("Authorization", this.getBasicAuthString_());
HttpEntity<String> requestEntity = new HttpEntity<String>(headers);
ParameterizedTypeReference<List<SampleItem>> typeRef = new ParameterizedTypeReference<List<SampleItem>>(){};
ResponseEntity<List<SampleItem>> response = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, typeRef, this.activityId, this.formId);
this.list = response.getBody(); if (isDebug) {buf.append(NL).append("list.size=").append(null!=this.list ? this.list.size() : -1).append(NL).append("list[0]=").append(null!=this.list && !this.list.isEmpty() ? this.list.get(0).toString() : "null");}
this.iterator = null!=this.list ? this.list.iterator() : null;
} catch (Exception e) {
logger.error(e.getMessage());
throw e;
} finally {
if (isDebug) {
logger.debug(buf.toString());
}
}
SampleItem 豆。注意大写属性,尝试匹配 JSON:
@JsonIgnoreProperties(ignoreUnknown = true)
public class SampleItem implements Serializable {
public String getORG_NAME() {
return ORG_NAME;
}
public void setORG_NAME(String s) {
this.ORG_NAME = s;
}
public String getADDRESS_1() {
return ADDRESS_1;
}
public void setADDRESS_1(String s) {
this.ADDRESS_1 = s;
}
public String getORG_ID() {
return ORG_ID;
}
public void setORG_ID(String s) {
this.ORG_ID = s;
}
public String toString() {
StringBuilder buf = new StringBuilder(getClass().getName());
buf.append("{").append(this.ORG_ID).append("}");
return buf.toString();
}
public int hashCode() {
return this.toString().hashCode();
}
public boolean equals(Object other) {
boolean b = null!=other && (other instanceof SampleItem);
if (b) {
b = this.toString().equals(other.toString());
}
return b;
}
private String ACT_ID = null;
private String ORG_ID = null;
private String ORG_NAME = null;
private String ADDRESS_1 = null;
private static final long serialVersionUID = -4839970923454745745L;
}
返回的 JSON。注意属性全部大写:
2016-09-15 14:14:29 [main] DEBUG g.n.h.a.c.s.SamplesRestItemReader pJsonString_ - json.str: [{"ACT_ID":7704,"ADDRESS_1":"800 North Pearl Street","ADDRESS_2":null,"DATAENTITY_ID":58184,"ENTITY_END_DATE":"06-JUN-2079","ENTITY_TYPE_ID":74,"HERDS_TABLE_NAME":"SCHOOLDRINKING_13536_00","ID1":"888888888889","ID2":"888888880000","LAST_SUBMITTED_DATE":"14/Sep/2016 09:34:11","LAST_SUBMITTED_USER":"tmb03","ORG_ID":58184,"ORG_ID1":"888888888889","ORG_NAME":"Z TEST PUBLIC SCHOOL","ORG_TYPE_ID":74,"POSTAL_CODE":"12204","SCH_LEAD_DT_COMPLETE_61752":"9/14/16","SCH_LEAD_OUTLETS_POSTR_61749":20,"SCH_LEAD_PREREG_COMPLI_61769":50,"SCH_LEAD_PREREG_NONCOM_61770":30,"SCH_LEAD_RESULTS_WEBSI_61927":null,"SCH_LEAD_SAMPLING_ATTE_61750":"on","SCH_LEAD_SAMPLING_COMP_61751":"on","SCH_LEAD_TOTAL_OUTLETS_61768":100,"SCH_LEAD_WAIVER_GRANTE_61772":0,"SCH_LEAD_WAIVER_PENDIN_61771":30,"TIME_SERIES_DATE":null,"TOWN_CITY":"Albany"}]
...
正确的结果,但ORG_ID 未设置:
2016-09-15 14:14:30 [main] DEBUG g.n.h.a.c.s.SamplesRestItemReader init_ -
URL=https://sgw.health.state.ny.us/doh2/applinks/webserv/herdsrestfulservices/surveyData/allfieldsdata/{activityId}/{formId}
activity=7704
form=13536
list.size=1
list[0]=gov.ny.health.adsg.ceh.slrs_hdny.SampleItem{null}
...
我已经尝试了SampleItem bean 上大小写属性的所有组合。
任何建议表示赞赏。
【问题讨论】:
标签: json spring jackson resttemplate