Igazából most is a véleményetekre lennék kiváncsi.
Szintén munkahelyi projectben azon mesterkedtem, hogy SOAP-os REST-es web service-t is meghagyom egészen addig, amíg teljesen világossá nem válik hogy az adott környezetben melyik a nyerő megoldás. Természetesen spring-gel inicializálom a service bean-eket, CXF-fel exportálom ki, JSR 181 web services és JSR 311 rest annotációkkal látom el a service metódusokat és a beaneket még JAXB annotációval is helyenként. Sikerült is, bár szerintem kicsit szőrös a dolog.
- Elösször is a JAX-RS a beanjeid Collection (list, map) mezőire megköveteli, hogy legyen mindnek alapértéke és csak gettere. Azaz ne lehessen null soha, legfejebb üres. Viszont a JAX-WS elvárja hogy mindenkinek legyen szép gettere és settere, különben nem számít proprtynek. Ez a kettő nem feltétlenül zárja ki egymást, csak kicsit megcsúfítja a bean-eket.
Például így fog kinézni egy bean:
/**
* Szerintem gáz, amikor magyar neve van egy osztálynak :)
* Majdnem mint amikor a javadoc is magyar.
*/
@XmlRootElement(name="csirke")
public class Csirke {
boolean isKopaszNyaku;
boolean isKendermagos;
List<Tojas> tojasok = new ArrayList<Tojas>();
@XmlTransient // Nem ezt a property-t hasznaljuk a rest apival
public List<Tojas> getTojasok() {return tojasok;}
public void setTojasok(List<Tojas> tojasok) {this.tojasok = tojasok;}
@XmlElement(name="tojas")
@XmlElementWrapper(name="tojasok")
public List<Tojas> getTojasLista(){ return getTojasok();}
}
Szóval szerintem kicsit összetúrkáltuk az alkalmazás legérzékenyebb részét: az adatmodellt. Ha az adatmodell csúnya, az mindennek rossz alaphangulatot ad. - A CXF-nek kicsit nehéz volt megmagyarázni, hogy ha pl a /services/ alá mappeltem a CXFServlet-et, akkor mit kell csinálnia akkor, amikor kap a /services/-re egy kérést. Azt hiszem az lehetett a baj, hogy nem állítottam be at address-t.
<jaxrs:server name="jaxrs-server" bus="rest" address="/rest">
<jaxrs:servicebeans>
<ref bean="csirkefarm">
</jaxrs:serviceBeans>
</jaxrs:server> - A service interfacekre raktam az annotációkat, hogy ha lecserélem az implementációt, akkor az új service-re már ne kelljen másolgatnom. Hát elég cifrán meg lett annotálva egy-egy ilyen metódus.
@WebService(name = "csirekFarm")
@Path("/csirkeFarm/")
public interface CsirkeDAO {
@WebMethod(operationName = "getCsirke")
@WebResult(name = "getCsirkeResult")
@GET
@Path("/csirke/{csirkeId}")
public void Csirke getCsirkeById(@Webparam(name="csirkeId") Long id);
Most, hogy az annotációk legyőzték az XML konfigurációkat, a kódunk tele van konfigurációval :-) A hétvégén összedobok hozzá egy archetype-ot, ha elég időm marad rá.