ФОН:
Текущее приложение 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, ... )
}