Tworzenie usług sieciowych SOAP oraz REST na platformie Java - 3 pytania i odpowiedzi ze szkolenia (wrzesień 2016)

Pytania w tym artykule pojawiły się podczas szkolenia Tworzenie usług sieciowych SOAP oraz REST na platformie Java realizowanego w dniach 12-16.09.2016r.


W jaki sposób w SOAP można przesyłać kolekcje rekordów z danymi?

"Jeśli chodzi o strukturę komunikatów - nie jest to żaden problem: XML Schema pozwala zdefiniować sekwencje nieograniczonej długości, a Java (technologie JAX-WS i JAXB) automatycznie mapuje to na listy obiektów. Wynikiem metody web serwisu może być po prostu List. Problemem może być fizyczny rozmiar komunikatów, który może wpływać na wydajność albo w ogóle być niemożliwy do obsłużenia w niektórych środowiskach sieciowych. Jeśli trzeba, można już samemu zaimplementować logikę dzielenia wyników na porcje zwracane w kolejnych zapytaniach (podobnie jak w aplikacjach webowych robi się dzielenie wyników wyszukiwania na strony)."

Czy JAX-RS potrafi automatycznie zamienić na format XML/JSON wynik będący kolekcją lub tablicą?

"Zamiana na XML działa dla tablic i list pod warunkiem, że elementy kolekcji są klasy obsługiwanej przez JAXB. Jeśli to nasza klasa, musimy ją oznaczyć @XmlRootElement.
Zamiana na JSON jest zależna od implementacji. W RestEasy (serwery JBoss/WildFly), gdy do obsługi formatu JSON używana jest biblioteka Jackson (obecnie domyślna konfiguracja), translacja jest możliwa i nie wymaga żadnych dodatkowych wysiłków. W innych implementacjach (Jettison, Moxy) często wymagania są takie same jak dla XML (@XmlRootElement)."

Projekt webowy używający technologii JAX-RS. Po skonfigurowaniu w web.xml chronionego dostępu do podkatalogu, serwer nie wpuszcza nawet wtedy gdy jesteśmy zalogowani (wciąż przekierowuje na formularz logowania)?

"Jeśli chroniony podkatalog mieści się w ramach ścieżek obsługiwanych przez aplikację JAX-RS (@ApplicationPath), to niezbędne jest włączenie obsługi ról w implementacji JAX-RS. W przypadku RestEasy trzeba wpisać:
<context-param>
<param-name>resteasy.role.based.security</param-name>
<param-value>true</param-value>
</context-param>
Ten wpis jest także niezbędny, aby działało @RolesAllowed."