Hallo liebe Community,
ich schreibe ein Programm, bei dem verschiedene API's mit Länderinformationen verknüpft und die Daten ans Frontend gesendet werden. Die API, die ich zur Ermittlung von Corona Fallzahlen verwende hat aber, im Gegensatz zu den anderen API's leider nicht alle Ländercodes ISO_2. Damit bekomme ich, wenn ich als RequestParam z.B. Barbados (BB) verwende, einen 500er Fehler mit "Null Pointer Expeption" zurück.
Da die JSON Form in der Corona API für die Liste aller Länder eine andere ist als die für die Abfrage einzelner Länder (und ich meine Modelle nicht aufblasen will),
und ich auch nicht glaube, dass jedes mal durch die Map iterieren um herauszufinden, ob dieser Ländercode tatsächlich existiert, die beste Lösung ist, dachte ich an try und catch.
Meine Idee: Wenn das mit der Abfrage z.B. von BB nicht funktioniert, wird der Fehler gefangen und die Variable auf null gesetzt. Mein Controller:
Die Funktionen aus dem Service
Und die (zumindest denke ich dass es diese sind) relevanten Objekte:
Das Problem: Es funzt nicht Postman sagt immer wieder: Nope. 500! Internal Server Error.
Ist auch das erste mal, dass ich try und catch so verwende...gibt es da eine andere Möglichkeit zu sagen: Liebes Programm, wenn Du hier nicht weiterkommst, tu bitte das hier...[...].? Oder ist mein Fehler ganz woanders?
Vielen Dank
Tom
ich schreibe ein Programm, bei dem verschiedene API's mit Länderinformationen verknüpft und die Daten ans Frontend gesendet werden. Die API, die ich zur Ermittlung von Corona Fallzahlen verwende hat aber, im Gegensatz zu den anderen API's leider nicht alle Ländercodes ISO_2. Damit bekomme ich, wenn ich als RequestParam z.B. Barbados (BB) verwende, einen 500er Fehler mit "Null Pointer Expeption" zurück.
Da die JSON Form in der Corona API für die Liste aller Länder eine andere ist als die für die Abfrage einzelner Länder (und ich meine Modelle nicht aufblasen will),
und ich auch nicht glaube, dass jedes mal durch die Map iterieren um herauszufinden, ob dieser Ländercode tatsächlich existiert, die beste Lösung ist, dachte ich an try und catch.
Meine Idee: Wenn das mit der Abfrage z.B. von BB nicht funktioniert, wird der Fehler gefangen und die Variable auf null gesetzt. Mein Controller:
Java:
package com.savetravel.SaveTravel;
import java.text.DecimalFormat;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.savetravel.SaveTravel.AllInfoObject.AllInfoObject;
import com.savetravel.SaveTravel.TravelWarning.TravelWarningObject;
import AllBasicCountryData.AllBasicCountryData;
import Corona.CoronaObject;
import Corona.CountryCoronaInner;
import com.savetravel.SaveTravel.TravelWarning.CountryCode;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/gettravelwarnings")
public class TravelWarningController {
AllInfoObject allInfoObject = new AllInfoObject();
TravelWarningObject travelWarningObject = new TravelWarningObject();
CoronaObject coronaObject = new CoronaObject();
Double coronaActiveCases = new Double(0);
boolean cocoExistsInCorona = false;
@Autowired
ApiService apiService;
@GetMapping("/onetw/")
public ResponseEntity<AllInfoObject> getAllInfos(@RequestParam(name = "coco", required = true) String coco)
throws JsonMappingException, JsonProcessingException {
coco = coco.toUpperCase();
try {
coronaObject = apiService.getCoronaByCountry(coco);
for (CountryCoronaInner countryCoronaInner : coronaObject.getCountrydata()) {
coronaActiveCases = (countryCoronaInner.getTotal_cases() - countryCoronaInner.getTotal_recovered());
allInfoObject.setCoronaActiveCases(coronaActiveCases);
cocoExistsInCorona = true;
}
} catch (Exception e) {
coronaActiveCases = null;
}
AllBasicCountryData allBasicCountryData = new AllBasicCountryData();
allBasicCountryData = apiService.getACDfromAPIService(coco);
if (cocoExistsInCorona) {
Double coronaPopulationRatio = (coronaActiveCases / allBasicCountryData.getPopulation());
DecimalFormat df = new DecimalFormat("0.000");
String coronaPopulationRatioRounded = df.format(coronaPopulationRatio);
allInfoObject.setCoronaByPopulation(coronaPopulationRatioRounded);
} else {
allInfoObject.setCoronaByPopulation(null);
}
return new ResponseEntity<AllInfoObject>(allInfoObject, HttpStatus.OK);
}
}
Die Funktionen aus dem Service
Java:
public CoronaObject getCoronaByCountry(String coco) {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.add("user-agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
RestTemplate restTemplate = new RestTemplate();
CoronaObject coronaCases = new CoronaObject();
ResponseEntity<CoronaObject> responseEntity = restTemplate.exchange(
"https://api.thevirustracker.com/free-api?countryTotal=" + coco.toUpperCase(), HttpMethod.GET, entity,
CoronaObject.class);
coronaCases = responseEntity.getBody();
return coronaCases;
}
public AllBasicCountryData getACDfromAPIService(String coco) {
RestTemplate restTemplate = new RestTemplate();
AllBasicCountryData newAllBasicCountryData = new AllBasicCountryData();
ResponseEntity<AllBasicCountryData> responseEntity = restTemplate
.getForEntity("https://restcountries.eu/rest/v2/alpha/" + coco, AllBasicCountryData.class);
newAllBasicCountryData = responseEntity.getBody();
return newAllBasicCountryData;
}
Und die (zumindest denke ich dass es diese sind) relevanten Objekte:
Code:
package com.savetravel.SaveTravel.AllInfoObject;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AllInfoObject {
String countryName;
String countryCode;
String lastUpdateTW;
Double travelWarningScore;
Double coronaScore;
String coronaByPopulation;
Double coronaActiveCases;
}
Java:
package Corona;
import java.util.ArrayList;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CoronaObject {
ArrayList<CountryCoronaInner> countrydata;
String stat;
}
Code:
package Corona;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CountryCoronaInner {
private Info info;
private Double total_cases;
private Double total_recovered;
private int total_unresolved;
private String total_deaths;
private String total_new_cases_today;
private String total_new_deaths_today;
private int total_active_cases;
private long total_serious_cases;
private int total_danger_rank;
}
Das Problem: Es funzt nicht Postman sagt immer wieder: Nope. 500! Internal Server Error.
Ist auch das erste mal, dass ich try und catch so verwende...gibt es da eine andere Möglichkeit zu sagen: Liebes Programm, wenn Du hier nicht weiterkommst, tu bitte das hier...[...].? Oder ist mein Fehler ganz woanders?
Vielen Dank
Tom