【问题标题】:Spring Batch: JSON not properly converted to List<SampleItem>Spring Batch:JSON 未正确转换为 List<SampleItem>
【发布时间】:2017-01-23 21:41:06
【问题描述】:

在我的 Spring Batch 作业中,第一步是从 REST 服务读取 JSON 数据并将其写入本地 HSQL 表以供以后处理。

我对@9​​87654321@ 的调用确实得到了预期的JSON,它确实将JSON 转换为List&lt;SampleItem&gt;

然而,奇怪的是,列表中的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&lt;SampleItem&gt;,其中包含一个项目(但没有在该项目上设置属性):

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


    【解决方案1】:

    我怀疑您与 Jackson 的默认属性命名策略有冲突,其中一些属性名称小写,来自 https://fasterxml.github.io/jackson-databind/javadoc/2.2.0/com/fasterxml/jackson/databind/PropertyNamingStrategy.html

    在没有注册自定义策略的情况下,默认 Java 属性 使用命名策略,保留字段名称,并删除 set/get/is 方法的前缀(以及小写的首字母) 大写字符序列)

    我找不到更具体的小写算法规范,但与其尝试第二次猜测,不如明确命名该属性,例如:

    @JsonProperty("ACT_ID")
    private String ACT_ID = null;
    

    您通过指定 @JsonIgnoreProperties(ignoreUnknown = true) 使事情变得复杂 - 如果您删除它,您可能会在反序列化时获得一个有用的异常,而不是一个空对象。

    值得为 json(反)序列化编写一个简单的单元测试来解决这些问题。

    【讨论】:

    • 你是对的。添加@JsonProperty 解决了这个问题。
    猜你喜欢
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多