Jestem stosunkowo nowy w świecie usług internetowych i wydaje mi się, że moje badania bardziej mnie zdezorientowały niż oświeciły, moim problemem jest to, że dostałem bibliotekę (słoik), którą muszę rozszerzyć o niektóre funkcje usług internetowych.
Ta biblioteka zostanie udostępniona innym programistom, a wśród klas w jar będą klasy, które mają metodę wywołującą usługę sieciową (która zasadniczo ustawia atrybut klasy, wykonuje jakąś logikę biznesową, taką jak przechowywanie obiektu w bazie danych, etc i odsyła obiekt z tymi modyfikacjami). Chcę, aby wywołanie tej usługi było tak proste, jak to tylko możliwe, miejmy nadzieję, że tak proste, aby programista korzystający z klasy musiał to zrobić.
Car c = new Car("Blue");
c.webmethod();
Uczyłem się JAX-WS do wykorzystania na serwerze, ale wydaje mi się, że nie muszę tworzyć wsimport
ani wsimport
na serwerze, ani na kliencie, ponieważ wiem, że oba mają zajęcia, potrzebuję tylko interakcji między zajęciami udostępniane na serwerze i kliencie. Jak myślisz, jaki sens ma wykonywanie usługi sieciowej i połączenia w klasie?
Odpowiedzi:
Rozumiem, że problem sprowadza się do tego, jak wywołać usługę sieciową SOAP (JAX-WS) z języka Java i uzyskać zwracający ją obiekt . W takim przypadku masz dwa możliwe podejścia:
wsimport
i używaj ich; lubO pierwszym podejściu (używając
wsimport
):Widzę, że masz już klasy biznesowe usług (podmiotów lub innych) i faktem jest, że
wsimport
generują one zupełnie nowy zestaw klas (które są w pewnym sensie duplikatami klas, które już masz).Obawiam się jednak, że w tym scenariuszu możesz tylko:
wsimport
wygenerowany kod, aby używał Twoich klas biznesowych (jest to trudne i jakoś nie warte - pamiętaj, że za każdym razem, gdy WSDL się zmieni, będziesz musiał ponownie wygenerować i ponownie dostosować kod); lubwsimport
wygenerowanych klas. (W tym rozwiązaniu kod biznesowy mógłby „używać” wygenerowanych klas jako usługi z innej warstwy architektonicznej).O drugim podejściu (stwórz własnego klienta SOAP):
Aby wdrożyć drugie podejście, musisz:
java.net.HttpUrlconnection
(i trochęjava.io
obsługi).Tworzenie klienta SOAP przy użyciu klasycznego
java.net.HttpUrlConnection
nie jest takie trudne (ale też nie takie proste), a w tym linku można znaleźć bardzo dobry kod początkowy.Polecam korzystanie z frameworka SAAJ:
Zobacz poniżej działający przykład (uruchom go!) Wywołania usługi WWW SOAP przy użyciu SAAJ. Nazywa tę usługę internetową .
Informacje o używaniu JAXB do serializacji / deserializacji są bardzo łatwe do znalezienia. Możesz zacząć tutaj: http://www.mkyong.com/java/jaxb-hello-world-example/ .
źródło
<xsd:element name="Incident_Number" type="xsd:string"/>
. Jak widać, element jest zamknięty i żadne informacje nie są generowane z WS.GetInfoByCity
jest503Service Unavailable
, to widzi. :(Lub po prostu użyj narzędzia wsdl2java Apache CXF do wygenerowania obiektów, których możesz użyć.
Jest zawarty w pakiecie binarnym, który możesz pobrać z ich strony internetowej. Możesz po prostu uruchomić takie polecenie:
Używa wsdl do generowania obiektów, których możesz użyć w ten sposób (nazwy obiektów są również pobierane z wsdl, więc twoje będą trochę inne):
Istnieje nawet wtyczka Maven, która generuje źródła: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
Uwaga: jeśli generujesz źródła za pomocą CXF i IDEA, możesz spojrzeć na to: https://stackoverflow.com/a/46812593/840315
źródło
Znalazłem znacznie prostszy alternatywny sposób generowania wiadomości mydlanej. Biorąc pod uwagę obiekt osoby:
Poniżej znajduje się prosty generator wiadomości mydlanych:
Możesz użyć:
źródło