Доброе утро,
Я использую API в формате JSON, данные о последних курсах обмена.
Я хочу, чтобы эти данные были загружены мне в начале приложения и сохранены в базе данных. Я использую пружину JPA.
Проблема в том, что я не знаю, как мне это записать.
У меня есть класс, отвечающий за соединение, которое возвращает вывод в виде строки.
Другой создает десериализацию.
У меня также есть два класса моделей, которые я могу использовать для загрузки данных.
Я не хочу создавать отдельный класс, в котором программа будет извлекать каждое значение отдельно. Я думал о карте, но не знаю, как это сделать.
Код:
Модель 1
@Data
@AllArgsConstructor
@Entity
public class CurrencyData {
@Id
@GeneratedValue( strategy = GenerationType.AUTO )
private Long id;
@SerializedName("rates")
@Expose
@Embedded
private Rates rates;
@SerializedName("base")
@Expose
@Embedded
private String base;
@SerializedName("date")
@Expose
@Embedded
private String date;
}
Модель 2
@Data
@AllArgsConstructor
@Embeddable
public class Rates {
protected Rates(){}
@SerializedName("CAD")
@Expose
private Double cAD;
@SerializedName("HKD")
}
ConnectService со строковым выходом API
private static final String REQUEST_CURRENCY = "https://api.exchangeratesapi.io/latest?base=USD";
public String connect() {
String output = null;
try {
System.out.println("URL String : " + REQUEST_CURRENCY);
URL url = new URL(REQUEST_CURRENCY);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new TODO("TODO : ", e.getMessage());
} else {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
output = response.toString();
}
} catch (Exception e) {
throw new OutputFromApiException("ConnectService CurrencyData-API: output is : ", e.getMessage());
}
return output;
}
GsonConvert - десериализация
public CurrencyData gsonCurrency(String answer) {
Gson g = new Gson();
CurrencyData currencyData = null;
try {
currencyData = g.fromJson(answer, CurrencyData.class);
} catch (Exception e) {
throw new OutputFromApiException("HistoricalFlight API output is empty ", e.toString());
}
return currencyData;
}
Репозиторий
@Repository
public interface CurrencyRepository extends JpaRepository<CurrencyData, Long> {
}
... И, наверное, я должен написать что-то здесь ..
@Bean
CommandLineRunner runner(CurrencyRepository currencyRepository) {
return args -> {
currencyRepository.save();
};
}