Почему клиент веб-службы Java (CXF, JAX-WS, JDK1.6) демонстрирует различное поведение в приложении Grails?CLASSPATH исправить? - PullRequest
2 голосов
/ 12 августа 2010

ФОН: Текущее приложение Grails должно взаимодействовать с устаревшим веб-сервисом от стороннего поставщика - (systinet) Использовал Apache CXF Инструмент Wsdl2Java для генерации сложных типов и сервисных интерфейсов. До сих пор довольно стандартные вещи, и это прекрасно работает с Java .

После написания некоторых тестовых классов и методов main () для упражнение Java-кода и предоставление тонкого слоя выше для Упрощенный интерфейс, я хотел вызвать этот код из приложения Grails. В частности, контроллеры Grails, сервисы, кварцевые рабочие места и лайк. Тем не менее, здесь все стало интересно.

Первая трассировка стека от плагина Grails CXF, вызывающая исключение FileNotFoundException. Помимо того, что мне не нужно загружать определение WSDL - поскольку я уже успешно запустил инструмент CXF Wsdl2Java, похоже, что-то здесь мне не хватает. Попытка замены файла: /// url *** для WSDL и получила еще одно исключение.

В конце всего этого - удалив плагины любого рода, я вручную перенастроил проект с зависимостями CXF ** и теперь получил исключение MarshallingException, в основном из кода, сгенерированного CXF! Который, кстати, прекрасно выполняется из класса Java.

Кто-то, я уверен, наверняка сталкивался с этой проблемой в ваших интеграциях с Grails. Как всегда, ваше руководство очень ценится!

1) Почему в приложении Grails среда выполнения пытается проанализировать wsdl? Кроме того, обратите внимание, что версии JDK являются той же версией Java "1.6.0_12".

2) Кто-нибудь может предложить какие-либо обходные пути CLASSPATH? Я предполагаю, что альтернативный подход - переписать вызовы Java среднего уровня с GroovyWS, но это было бы довольно трудоемко - учитывая количество сервисов и пользовательских типов, в которые встроил поставщик.

static {
    URL url = null;
    try {
        url = new URL("http://mydevhost:9080/wasp/bmc-security/ctsa/person");
    } catch (MalformedURLException e) {
        System.err.println("Can not initialize the default wsdl from server");
        // e.printStackTrace();
    }
    WSDL_LOCATION = url;
}

/ * static { URL url = null; пытаться { url = новый URL ("file: /// C: /Projects/beta/workspace/reqmgr3/wsdl/Person.wsdl"); url.getPath (); } catch (MalformedURLException e) { System.err.println («Не удается инициализировать wsdl по умолчанию из файловой системы»); // e.printStackTrace (); } WSDL_LOCATION = url; } * /

`

**** Следы стека

ИНФОРМАЦИЯ: Не определен доверительный интервал для передачи ... 11 августа 2010 18:26:16 org.apache.cxf.transport.http.HTTPConduit finalizeConfig ИНФОРМАЦИЯ: Не настроен основной поставщик аутентификации для Conduit '... 11 августа 2010 18:26:16 org.apache.cxf.transport.http.HTTPConduit prepare ИНФОРМАЦИЯ: Chunking установлен на 2048. 11 августа 2010 18:26:16 org.apache.cxf.phase.PhaseInterceptorChain doIntercept ИНФОРМАЦИЯ: Перехватчик выдал исключение, теперь раскручивается org.apache.cxf.interceptor.Fault: Marshalling Error: com.systinet.wsdl.com.bmc.security.ess.webservice.holder.ArrayOfLog inPairHolder не известен в этом контексте в org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall (JAXBEncoderDecoder.java:132) в org.apache.cxf.jaxb.io.XMLStreamDataWriter.write (XMLStreamDataWriter.java:42) в org.apache.cxf.jaxb.io.XMLStreamDataWriter.write (XMLStreamDataWriter.java:30) в org.apache.cxf.interceptor.BareOutInterceptor.handleMessage (BareOutInterceptor.java:73) в org.apache.cxf.phase.PhaseInterceptorChain.doIntercept (PhaseInterceptorChain.java:148) в org.apache.cxf.endpoint.ClientImpl.invoke (ClientImpl.java:215) в org.apache.cxf.frontend.ClientProxy.invokeSync (ClientProxy.java:73) atg.apache.cxf.jaxws.JaxWsClientProxy.invoke (JaxWsClientProxy.java:122) на $ Proxy44.login (неизвестный источник) ... ... еще 2

ОБНОВЛЕНИЕ 15 августа:

Решил, из-за модульности и целесообразности, поместить этот код в отдельный WAR-проект, который предложит его ltd. услуги, а не выставлять оригинальные веб-службы поставщика, которые слишком громоздки.

Этот проект будет на чистой Java и использует среду выполнения Metro 2.0.1, которая составляет около 16 МБ.

Вызов сервисов промежуточного программного обеспечения на основе Java из Grails теперь возможен после очистки папок lib и src / java - в основном это только что установленный плагин ws-client и настройка локальных сервисов, таких как:

import groovyx.net.ws.WSClient 
import org.grails.plugins.wsclient.service.WebService 

class LocalPersonService { 
    WebService webService 
    groovyx.net.ws.WSClient  _proxy 
    static final String PERSON_WSDL_URL = "http://localhost:9090/pri/PersonServicePort?wsdl" 

    def transactional = false 

    def getPersonDetails( String customerId, User userAccount, String userCredential ) { 
        // must cache the proxy 
        if ( _proxy == null ) { 
            print( "init proxy.  Parsing wsdl..." ) 
            try { 
                _proxy = webService.getClient(PERSON_WSDL_URL) 
            } 
            catch ( Throwable tr ) { println( tr.getMessage() ) } 
        } 

        // method shall return a  (com.siventures.example.service.PersonDetails) 
        return _proxy.getPersonDetails( customerId, userAccount, userCredential, ... ) 
    } 
...