Problem z programem Stacja Kosmiczna ISS - Git-Hibernate-Maven

Problem z programem Stacja Kosmiczna ISS - Git-Hibernate-Maven
Tomasz J
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

Witajcie,

Mam problem z programem i potrzebuje review code i świeżego spojrzenia kogoś z zewnątrz bo patrzę na ten mój kod i wszystko wydaje się być dobrze i program się uruchamia ale nie działa prawidłowo. Pierwszy raz robię taką aplikacje sam więc proszę bądźcie wyrozumiali ;)

Problem: nie zapisuje mi danych szerokości i długości geograficznej obecnego położenia stacji kosmicznej ze strony
--> http://api.open-notify.org/iss-now.json
do mojej lokalnej bazy danych.

Podaje linka do git-huba
https://github.com/tomaszJablonski/ISS-Hibernate-Maven

Będę wdzięczny za wszelką pomoc.

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
1

A problem jest z czym? Debugowałeś swój kod?
Repo czyta się tragicznie...

Ale to co mi rzuciło się w oczy co może być błędem to chyba tutaj https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/program/speedOfTheISS/client/ISSResponse.java

lista z responsea musi mieć taką samą nazwę czyli iss_position

Tomasz J
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

używałem ale nic nie pokazuje debugger , a co do tej listy to przecież nazwa może być dowolna, nie czaje co masz na myśli ...

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
1
Tomasz J napisał(a):

używałem ale nic nie pokazuje debugger

Tzn, że źle go używasz.

Dopiero teraz zobaczyłem, że to API nie zwraca listy tylko kolejny 'obiekt'
screenshot-20220506192738.png

Więc Twój typ

Kopiuj
List<ISSPosition> issPositionList

jest błędny w momencie mapowania odpowiedzi do obiektu javowego. Do tego tak jak mówiłem, nazwy z jsona muszą się u Ciebie zgadzać. Gdzie w zwracanym responsie z API masz coś takiego jak

Kopiuj
issPositionList

?

Tomasz J
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

Ok zmieniłem nazwę ale to nic nie dało ciągle jest ten sam error.
Czyli issPositionList zmieniłem na iss_position i używam tej listy w ISSClient w returnie metody getISSLocation()

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
0

No to prześledź stacktrace i sprawdź gdzie się wysypuje :)

BTW czemu tutaj: https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/program/speedOfTheISS/client/IssClient.java#L25
do adresu dodajesz jakieś parametry? Skoro pod to API uderzasz najzwyklejszym GETem na świecie bez żadnych parametrów.

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
2

https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/program/speedOfTheISS/client/IssClient.java#L40

Kopiuj
try {

} catch (Exception e) {
    return Optional.empty();
}

Popełniłeś tutaj grzech ciężki

DOstajesz exception podczas mapowania odpowiedzi z API na swój obiekt javowy. A Ty nawet o tym nie wiesz (pomijam to, że nie umiesz odpalić debuggera) bo łapiesz ten wyjątek i nawet go nie logujesz na konsole. Dodaj sobie zwykłe System.out.println(e.getMessage()) i będziesz widział co dostajesz :)

Wracając do mojej poprzedniej odpowiedzi. Tutaj https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/program/speedOfTheISS/client/ISSResponse.java#L11
dalej masz listę. To jest błędne.

Nazwe nadaj w konwencji javowej, i dodaj adnotacje zeby jackson odczytywal to jako iss_position.

Tomasz J napisał(a):

emm wzorowałem się przykładem z mojego kursu i sądziłem, że to potrzebne dlatego to dodałem. To jest właśnie mój obecny problem, nadal się uczę prawidłowo pobierać dane ze strony

https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/program/speedOfTheISS/client/IssClient.java#L25
Tak naprawde to, że dodałeś String.format() nic nie zmieniło bo w twoim stringu który podajesz (stała URL) nie ma nawet miejsca na wstawienie tych latitude, longitude

Tak jak mówiłem, nie ma sensu tutaj w ogóle podawać tych wartości. Co to za wartości? Przecież ty chcesz je pozyskać z API, a nie przesłać do API nie wiadomo co.

Tomasz J
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

No wreszcie zaczęło się coś dziać.
{"status": "error", "message": "Unrecognized field "message" (class com.iss.program.speedOfTheISS.client.ISSResponse), not marked as ignorable (one known property: "iss_position"])
at [Source: (String)"
{"iss_position":
{"latitude": "38.0668", "longitude": "68.9173"}, "message": "success", "timestamp": 1651863930}"; line: 1, column: 79] (through reference chain: com.iss.program.speedOfTheISS.client.ISSResponse["message"])"}

coś zaczyna wreszcie widzieć ale coś tam jeszcze mi nie trybi, zaraz będę szukał co.
Zmiany commitowałem.

Tomasz J
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0
Kopiuj
public String getISSLocation(ISSLocation issLocationNow) {
        try {
            ISSLocation issLocation = issService.generateLocation(issLocationNow);
            ISSLocationDTO locationDTO = issMapper.issLocationDTO(issLocation);
            return objectMapper.writeValueAsString(locationDTO);

tutaj pokazuje mi, że są same nulle według debuggera...

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
2

https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/program/speedOfTheISS/ISSService.java#L17

Tutaj robisz coś totalnie nielogicznego.

issLocationService (dziwna nazwa w ogole...) ma prawidłowe wartości, natomiast issLocation nie ma nic.
Następnie w 19 i 20 zastępujesz prawidłowe wartości nullami...
I zwracasz to issLocation ktore nie ma nic XD

Tomasz J
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 22
0

Rany doszedłem do tego wreszcie czemu tam były te przeklęte nulle xD I pierwsza opcja programu prawidłowo pobiera dane ze strony i zapisuje je do bazy danych :D
Matko moja radość nieopisana :D
Ale nie dał bym sobie rady gdyby nie pomoc @kixe52
Wielkie dzięki za wsparcie, na prawdę wiele się nauczyłem :)

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
1

Wiele jeszcze przed Toba. Jestem na telefonie więc nie dorzucę linka, ale gdzieś tam w kodzie robisz dziwne akcje w stylu

Kopiuj
Location funkcja(parametrA) {
Obiekt bb = cosTam()
parametrA.setPole(bb.getPole)
return parametrA
}

Nie rób tak. Powinieneś z funkcji zwrócić nowy obiekt, a nie zmodyfikowany parametrA który tak naprawdę 3 klasy 'wyzej' jest u Ciebie new parametrA i sam w sobie nic nie robi.

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
1
Tomasz J napisał(a):

jak zajrzysz do kodu to w klasie ISSService w metodzie generateLocation , teraz ma to sens i działa bo to poprawiłem.

Nie ma sensu. https://github.com/tomaszJablonski/ISS-Hibernate-Maven/blob/master/src/main/java/com/iss/UserInterface.java#L63

Kopiuj
 private void getLocation() {
        String responseBody = issController.getISSLocation(new ISSLocation());
        responseBody = responseBody
                .replaceAll("\\{", "\n\t\\{")
                .replaceAll("}]", "}\n]");

        System.out.println("Odpowiedź serwera: \n" + responseBody + "\n");
    }

W jakim celu tutaj przesyłasz do controllera nowy obiekt? To jest to co Ci tłumaczyłem wyżej.
Zamiast tego w ISSService w generateLocation() powinieneś stworzyć ten obiekt w stylu

Kopiuj
var response = issClient.getIssLocation(); 
return new ISSLocation(response.getLatitude(), response.getLongitude());

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.