Wpis z mikrobloga

Cześć. Mam problem z SOAP Web Services w Javie. Mam dwie tabele: Flight i Ticket - relacja jeden do wielu oraz metodę w web serwisie, która zwraca konkretny Flight. Niestety działa to tylko, gdy do Flight nie jest przypisany żaden Ticket. Gdy Flight posiada jakieś Tickety i odwrotnie to generowana jest jakaś nieprawidłowa odpowiedź.

Używam Hibernate i jak wyświetlam sobie pobrane dane w konsoli to jest ok, czyli mapowanie tabel na klasy działa.

Tak wygląda odpowiedź serwera, gdy Flight nie ma żadnych Ticketów: LINK
Tak, gdy Flight posiada chociaż jeden Ticket: LINK
Metoda zwracająca Flight: pastebin

Nie ma żadnych błędów w konsoli po stronie serwera. Macie jakieś pomysły jak to naprawić?

#naukaprogramowania #programowanie #webdev #java
  • 20
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

  • 0
@bananowy_szejk Ciekawe, odpowiedz jest niby chunked, ale nie zawiera chunków. Ani też content-length. Podejrzewam, że klient lub serwer tnie połączenie przed wysłaniem całości. Jesteś pewien, że nie połykasz wyjątków po stronie serwera (to by tłumaczyło pustą konsolę)? Podepnij debugger i przejdź się po metodzie, którą tu wysłałeś
  • Odpowiedz
  • 0
@UschiOtze Dobra, teraz widzę, że połykasz wyjątek, wrzucając go na konsolę (słabe to, ale w tak krótkim programie obleci. Protip: użyj loggera Protip2: łap wyjątki w Web method i zrób obsługę błędów w soapie)
  • Odpowiedz
@UschiOtze:
Jednak jest różnica, zwracane są obiekty, ale i tak odpowiedź wygląda tak samo:

[models.Ticket@29108192, models.Ticket@54cc432e, models.Ticket@7f3b46df, models.Ticket@7f603606, models.Ticket@5fd13ef6, models.Ticket@7164fe63, models.Ticket@3bdc6e15, models.Ticket@7df762da]
EDIT: Może to ma coś wspólnego z rekursywnym wywyływaniem, Flight ma tickety, Ticket ma flighta i tak w koło. Tylko wtedy powinien być jakiś exception czy coś.
  • Odpowiedz
  • 0
@bananowy_szejk I prawidłowo - tak to jest skonfigurowane w hbm.xml

Gdyby Hibernate rzeczywiście rozwijał to w nieskończoność, to już dawno poleciałby out of memory error. Sądzę, że zarówno metoda z repozytorium jak i entry point websrvice’u kończą się prawidłowo, natomiast problem występuje po zakończeniu entry pointa, kiedy wynik zapytania pakowany jest do xmla
  • Odpowiedz
@cyfron_v2: Tak, te same klasy. Właśnie wychodzi na to, że jaxb nie wie jak je zmapować. Jak się zabrać za mapowanie klas do XMLa? Hibernate udostępnia jakieś adnotacje czy trzeba stworzyć jakiś plik konfiguracyjny?
  • Odpowiedz
@bananowy_szejk: w web serwisach najczęściej stosuje się podejście contract first, tj. piszemy najpierw wsdl i xsd i z nich generujemy klasy. Drugie podejścieto pisanie klas z adnotacjami jaxb. Nie zalecam, chociaż jest to możliwe, używania tych samych klas do jpa i jaxb.
  • Odpowiedz
@cyfron_v2: Wzoruję się na tym poradniku: link.
W klasie Flight dodałem @XmlTransient przy liście powiązanych biletów, w klasie Ticket dodałem @XmlElement przy powiązanym Flight. No i cały czas zwraca pusty Flight, mimo iż w konsoli jest normalnie obiekt klasy Flight.
Gdy miałem odwrotnie (@XmlTransient przy powiązanym Flight w klasie Ticket i @XmlElement i wrapper przy liście Ticketów w klasie Flight) to zwracało mi normalnie Flight z listą
bananowyszejk - @cyfronv2: Wzoruję się na tym poradniku: link.
W klasie Flight dodał...

źródło: comment_LvgUnt9M7O3MMeqoct2MXFKGbrYXLL6w.jpg

Pobierz
  • Odpowiedz