java spring boot web app

e0uiprwp  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(273)

我已经建立了一个“stockprice”实体、服务和存储库,允许将数据添加到mysql表中。该表具有以下列格式:

...

我试图从一个api中获取数据放在这个表中,问题是我试图获取的数据是json数据(比mysql表中的参数少一些)。所以我在处理这些数据时遇到了麻烦。
在我的服务类中,我定义了以下内容:

...

@Service
public class StockPriceService {
  ...
  @PostConstruct
  public void populateStockPriceFromAPI() {

    ResponseEntity<List<StockPrice>> response = restTemplate.exchange(
      "https://cloud.iexapis.com/stable/stock/AAPL/chart/date/20210224?token=" + apiKey +"&chartIEXOnly=true",
      HttpMethod.GET,
      null,
      new ParameterizedTypeReference<List<StockPrice>>(){});
    List<StockPrice> result = response.getBody();

              // Save the list into a database
              if(Objects.nonNull(result)) result.stream().filter(Objects::nonNull).forEach(element -> stockPriceRepository.saveAndFlush(element));

    }
}

此api请求返回苹果2021年2月24日的盘中股价;并且是json格式:

[{'date': '2021-02-24', 'minute': '09:30', 'label': '09:30 AM', 'high': 125.34, 'low': 124.52, 'open': 124.71, 'close': 125.21, 'average': 125.034, 'volume': 22151, 'notional': 2769618.735, 'numberOfTrades': 225}, {'date': '2021-02-24', 'minute': '09:31', 'label': '09:31 AM', 'high': 125.3, 'low': 124.23, 'open': 125.175, 'close': 124.695, 'average': 125.043, 'volume': 20496, 'notional': 2562891.48, 'numberOfTrades': 110},...]

i、 e.缺少6个字段-“ticker”、“relative\u strength”、“ma30”、“ma7”、“ma365”、“id”。id是自动递增的,所以这应该不是问题。
运行时,出现以下错误:

java.lang.ClassCastException: class java.lang.StackTraceElement cannot be cast to class java.lang.String (java.lang.StackTraceElement and java.lang.String are in module java.base of loader 'bootstrap')
    at java.base/java.io.ObjectInputStream.readTypeString(ObjectInputStream.java:1792) ~[na:na]
    at java.base/java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:835) ~[na:na]
    at java.base/java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:991) ~[na:na]
    at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2017) ~[na:na]
    at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1895) ~[na:na]
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2202) ~[na:na]
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712) ~[na:na]
    at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2540) ~[na:na]
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2434) ~[na:na]
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2235) ~[na:na]
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712) ~[na:na]
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519) ~[na:na]
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477) ~[na:na]
    at org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1587) ~[tomcat-embed-core-9.0.37.jar:9.0.37]

objectinput显然失败了,但我不确定是因为api数据中的字段与表中的字段不同,还是因为返回了json数据而完全误解了json数据 [na:na] . 如果有人能给我一些关于如何解决这个问题的建议,我将不胜感激:)

h6my8fg2

h6my8fg21#

通常,当您使用api执行请求时,需要创建一个响应类,并在Map到实体后执行,因此:
使用响应api的变量创建stockpriceresponse,然后在服务中使用方法toentity()进行Map,并将api不返回的变量初始化。
我明白你的问题了吗?
例子:

public void toEntity(PreRR entity, PreRResponse obj) {

    entity.setDescription(obj.getDescription());
    entity.setExecutionDate(obj.getExecutionDate());
    entity.setElement(obj.getElement());
    entity.setCoccole(obj.getCoccole());
    //Variable that is not recived by api
    entity.setMario("PROVA MARIO"));
}

相关问题