W nawiązaniu do poprzedniej noty o CXFie, którą napisałem jakiś czas temu, gonię aby uzupełnić brak konfiguracji klienta. Sam proces jest bardzo zbliżony do tworzenia klienta w oparciu o XFire. Nie jest wymagana duża ilość kodu Javy, a w zasadzie tylko dwa pliki XML (client.xml, myservice.xml).
Pierwszy z nich odpowiada za wczytanie wymaganych rozszerzeń CXFa oraz definicję bazowej konfiguracji fabryki z interceptorami. W interceptorach możemy skonfigurować logowanie, obsługę załączników czy standardów WS-Security etc. Wszystkie te ustawienia będą dziedziczone, a fabryki docelowych usług będą dodawać tylko adres, do odpytywania. Na koniec bean klienta będzie miał określony autowire by nie przekazywać mu wszystkich własności.
Oto najważniejsze wstawki kodu oraz ich opis: [sourcecode language=“xml”]org.code-house.cxfparent1.0-SNAPSHOT4.0.0org.code-house.cxfclient1.0-SNAPSHOTCode House.Org - CXF - Clientlog4jlog4j1.2.12org.code-house.cxfcontract1.0-SNAPSHOTorg.apache.cxfcxf-rt-frontend-jaxwsorg.apache.cxfcxf-rt-transports-httporg.apache.cxfcxf-rt-transports-http-jetty${code-house.cxf.version}org.springframeworkspring-core${code-house.spring.version}org.springframeworkspring-test${code-house.spring.version}testorg.springframeworkspring-beans${code-house.spring.version}org.springframeworkspring-core${code-house.spring.version}org.springframeworkspring-context${code-house.spring.version}[/sourcecode]
Deskryptor nie jest zbyt złożony, istotny jest tylko kawałek z kontraktem, który jak wskazuje nazwa jest definicją używanych typów: [sourcecode language=“xml”]org.code-house.cxfcontract1.0-SNAPSHOT[/sourcecode]
Teraz kolej na jedyną wstawkę Javy, która się pojawia w projekcie. Jest to zwykły bean, który będzie miał później wstrzykiwane obiekty pośredniczące w wywoływaniu usług.
[sourcecode language=“java”]package org.code_house.cxf.client;
import org.code_house.services.maven.MavenArtifactType;
/\\ \* Klient usług Code-House. \* \* @author Łukasz Dywicki email \* \* $Id$ */ public class Client {
/\\ \* Usługa do obsługi wyszukiwania artefaktów Mavena. */ private MavenArtifactType maven;
/\\ \* Pobranie wartości pola maven. \* \* @return Wartość maven. */ public MavenArtifactType getMaven() { return maven; }
/\\ \* Ustawienie wartości pola maven. \* \* @param maven Nowa wartość pola maven. */ public void setMaven(MavenArtifactType maven) { this.maven = maven; } }[/sourcecode]
Resztę magii załatwia Spring: [sourcecode language=“xml”][/sourcecode]
Zgodnie ze wstawką w linii 20 konieczna jest jeszcze konfiguracja usługi. Sztuczka polega na użyciu części konfiguracji zdefiniowanej wcześniej - baseClientFactory. [sourcecode language=“xml”][/sourcecode]
Ustawienia, które mogą ulec zmianie, to znaczy użytkownik, hasło oraz adres usługi są wyodrębnione do pliku client.properties: [sourcecode language=“properties”] # Placeholdery dla kontekstow springa # Adresy uslug server.port = 8080 host = localhost org.code_house.cxf.service.maven http://${host}:${server.port}/webapp/services/maven
# Autoryzacja org.code_house.cxf.user org.code_house.cxf.password [/sourcecode]
No i na koniec opcjonalny test, który odpytuje usługę: [sourcecode lang=“java”] package org.code_house.cxf.client; import org.code_house.services.maven.definition.ArtifactInfo; import org.code_house.services.maven.types.FindArtifactRequest; import org.code_house.services.maven.types.FindArtifactRespose; import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
/\\ \* Proste wywołanie klasy klienta. \* \* @author Łukasz Dywicki email \* \* $Id$ */ public class MainTest extends AbstractDependencyInjectionSpringContextTests {
/\\ \* Wstrzyknięty klient. */ private Client client;
@Override protected String[] getConfigLocations() { return new String[] {“classpath:client.xml”}; }
public void testOne() { FindArtifactRequest request = new FindArtifactRequest(); ArtifactInfo artifact = new ArtifactInfo(); artifact.setGroupId(“org.code_house.cxf”); artifact.setArtifactId(“contract”); request.setQuery(artifact);
FindArtifactRespose respose = client.getMaven().findArtifact(request); System.out.println(respose.getDownloadURL()); }
/\\ \* Ustawienie wartości pola client. \* \* @param client Nowa wartość pola client. */ public void setClient(Client client) { this.client = client; }
}[/sourcecode]
To by było na tyle. Cały działający kod projektu jest już zamieszczony przy poprzedniej nocie, paczka ze wszystkimi listingami gotowa do pobrania.
Teraz chyba pora zacząć opisywać mechanizmy Springa. :)