Я создал объект, службу и репозиторий StockPrice, который позволяет добавлять данные в таблицу mysql. Таблица имеет следующий формат столбца: col1 ... col2

Я пытаюсь получить данные из 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 возвращает дневные цены акций Apple на 24.02.2021; и находится в форме 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},...]

То есть отсутствуют 6 полей - Ticker, relative_strength, ma30, ma7, ma365, 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, потому что он возвращает [na:na]. Если бы кто-нибудь мог дать мне совет, как это исправить, я был бы очень признателен :)

0
George 27 Фев 2021 в 20:56

1 ответ

Лучший ответ

Обычно, когда вы делаете запрос с помощью Api, вам нужно создать класс Response и после сопоставления с Entity, поэтому:

Создайте StockPriceResponse с переменной, которая отвечает на api, после этого в службе вы можете сопоставить с методом toEntity () и инициализировать переменную, которую 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"));
}
0
sourheart 1 Мар 2021 в 09:06