我已经建立了一个“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]
. 如果有人能给我一些关于如何解决这个问题的建议,我将不胜感激:)
1条答案
按热度按时间h6my8fg21#
通常,当您使用api执行请求时,需要创建一个响应类,并在Map到实体后执行,因此:
使用响应api的变量创建stockpriceresponse,然后在服务中使用方法toentity()进行Map,并将api不返回的变量初始化。
我明白你的问题了吗?
例子: