Temat: Web Service Broker
Nie chce nic mówić, ale jak ogólny i poprawny by był ten wzorzec, to trochę traci on rację bytu, że względu na to, że JAX-RPC jest przestarzałą i toporną technologią rodem z J2EE, której nie powinno się używać (chyba, że nie można zmigrować projektu na Java 5).
Teraz stosuje się JAX-WS z JEE5 + JAXB z Java 5/6, gdzie wcale nie trzeba posługiwać się klasami pomocniczymi i tym samym wzorcami, aby to opisać: wystarczy po prostu zdefiniować klasy adnotowane JAXB i napisać prostą klasę beana EJB, adnotowaną "WebService" i "Stateless".
Klasy adnotowane JAXB mogą być generowane automatycznie z XML Schema i na odwrót. WSDL'a można łatwo uzyskać z sygnatury takiego serwisu w czasie kompilacji, albo po jego umieszczeniu na serwere w czasie uruchomienia (runtime).
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.WebResult;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
/**
* @author Borys Madrawski
*/
@Stateless()
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
@WebService(portName=CoreName.PortName)
public class CoreWebService {
private final Logger logger = Logger.getLogger(CoreWebService.class.getName());
@EJB
ReceiveTeamQueueOrdersMediatorLocal receiveTeamQueueOrdersMediator;
@EJB
ReceiveOrderDetailsMediatorLocal receiveOrderDetailsMediator;
@EJB
ModifyOrderDetailsMediatorLocal modifyOrderDetailsMediator;
@EJB
AuthenticateMediatorLocal authenticateMediator;
@EJB
ReceiveOutdatedInfoMediatorLocal receiveOutdatedInfoMediator;
/**
* To jest Web Service!
*/
@WebMethod(operationName = CoreName.ReceiveTeamQueueOrders)
@WebResult(name = CoreName.OrdersResponse)
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public TeamQueueOrdersResponse receiveTeamQueueOrders(@WebParam(name = CoreName.OrdersRequest) TeamQueueOrdersRquest request) {
logger.entering(null, CoreName.ReceiveTeamQueueOrders, request);
//TODO
logger.exiting(null, CoreName.ReceiveTeamQueueOrders, response);
return response;
}
...
...
...
}
Klasy TeamQueueOrdersResponse i TeamQueueOrdersRquest są niczym transfer objekty, są POJO, ale adnotowanym przez adnotacje JAXB, tak że implementacja JAX-WS wie jak je serializować i deserializować realizując usługę zgodną z Web Services. W tym przypadku klasy te były generowane taskiem Maven2 ze zbioru plików (*.xsd) XML Schema.
Warto zauważyć, że po stronie klienta Web Services, używając Java 6 i nowszej nie trzeba używać żadnych dodatkowych bibliotek: JAXB 2.x jak i klient WS jest wbudowany w rt.jar (jedynie warto wygenetować sobie stub bibliotek klienckich do serwisu z pliku/URL'a do WSDL).
Standardowo JAX-WS ma jednak ograniczenie: nie wspiera wiadomości typu XML-RPC.
Borys M. edytował(a) ten post dnia 07.12.09 o godzinie 12:45