todvora / eet-client

Client and library for #EET communication - http://www.etrzby.cz/ , written in Java
MIT License
48 stars 26 forks source link

Pouziti v prostredi s knihovnou JDK Metro WS (javax.ws) #13

Closed rds76 closed 7 years ago

rds76 commented 7 years ago

Jeste mam zde tip pro nasazani v prostredi, kde se standardne pouzivaji knihovny JDK javax.ws, napr. J2EE Glassfish. WS client stubs je potreba vytvaret pres factory knihovny WS Apache CXF, nebot classloader ws provider primarne pouzije knihovnou z javax.ws. Je potreba pozmenit kod metody getPort ve tride SecureEETCommunication /tak aby WS client byl implementovan vzdy knihovnou Apachace CXF/ nasledovne:

protected EET getPort(final CommunicationMode mode, final EndpointType endpointType) {
        /*
        * Pro Payara JEE nutno vytvaret stub pres factory kvuli zakazane delegaci javax
        * https://github.com/payara/Payara/issues/1249
        */
        final org.apache.cxf.jaxws.JaxWsProxyFactoryBean factory = new org.apache.cxf.jaxws.JaxWsProxyFactoryBean();
        factory.setServiceClass(EET.class);
        factory.getClientFactoryBean().getServiceFactory().setWsdlURL(WEBSERVICE.getWSDLDocumentLocation());
        factory.setServiceName(WEBSERVICE.getServiceName());        
        final EET port = (EET) factory.create();
        /* Puvodni verze
        final EET port = WEBSERVICE.getEETServiceSOAP();
        */

        final Client clientProxy = ClientProxy.getClient(port);
        ...

Vice k tomuto problemu je mozno docist se zde

todvora commented 7 years ago

Zdravím, Díky za tip. Stejný kód funguje bez problémů i v čisté javě mimo kontejner. Možná bych tak ponechal jen vaší variantu. Pomohlo by, kdyby byl port vytvářen vždy kódem výše? Případně umožnit knihovně předat vlastní callback pro vytvoření portu?

Jak to řešíte teď? Vlastní fork a přepsané metody?

S pozdravem Tomáš

rds76 commented 7 years ago

Ano, musi fungovat, rozdil je akorat v tom, ze pouzitou implementaci WS clienta neurci classloader, ale je primarne vynucena ApacheCXF knihovna pomoci fakctory metod. Ostatne to popisuje i dokumentace Apache CXF:

public class JaxWsProxyFactoryBean extends ClientProxyFactoryBean Factory for creating JAX-WS proxies, This class provides access to the internal properties used to set-up proxies. Using it provides more control than the standard JAX-WS APIs.

Jinak resim to lokalni upravou kodu metody.

Jeste jednu upravu jsem byl nucen provest a to na tomto radku . K nahrani resource jsem pouzil tento kod /mel by byt univerzalnejsi/:

private static final EETService WEBSERVICE = new EETService(Thread.currentThread().getContextClassLoader().getResource("schema/EETServiceSOAP.wsdl"));

Muzete vyzkouset jestli je funkcni i mimo kontejner? Diky

todvora commented 7 years ago

Rozumím, opravil jsem, otestoval, zdá se vše v pořádku.

Instanci EET service nakonec vytvářím pomocí

private static final EETService WEBSERVICE = new EETService();

Což v důsledku načítá WSDL obdobně, jako navrhujete, jen bez explicitního předávání parametru.

EETService.class.getClassLoader().getResource("schema/EETServiceSOAP.wsdl")

Veškeré změny na větvi: https://github.com/todvora/eet-client/tree/apache-cxf-proxy

Zkuste prosím otestovat, pokud to bude OK i pro vaše použití, zmerguji a releasnu.

S pozdravem Tomáš

rds76 commented 7 years ago

Ok. Tak zda se, ze je to takto funkcni. Jinak v nejblizsich dnech otestuji ostry certifikat na produkcnim EET rozhrani. Ostry certifikat totiz nelze pouzit na playground.

rds76 commented 7 years ago

Potvrzuji funkcnost s ostrymi certifikaty na produkcnim EET, vcetne overeni podpisu response zpravy prilozenymi root a subord. CA certifikaty Verze Java: OpenJDK1.8

todvora commented 7 years ago

Paráda, díky. Release 2.0.4 obsahuje výše zmíněné úpravy. Snad bude vše fungovat dle očekávání, bez nutnosti držet vlastní fork a přepsané metody :-)

Díky za pomoc!