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. :)