背景: 当前的Grails应用程序必须与“遗留”Web服务进行交互 来自第三方供应商 - (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解决方法吗?我想另一种方法是使用GroovyWS重新编写Java中间层调用,但这将是非常费力的 - 给定数量的服务和供应商已经出现的自定义类型。
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 =新网址(“file:/// C:/Projects/beta/workspace/reqmgr3/wsdl/Person.wsdl”); url.getPath(); } catch(MalformedURLException e){ System.err.println(“无法从文件系统初始化默认的wsdl”); // e.printStackTrace(); } WSDL_LOCATION = url; } * /
`
****堆栈痕迹
信息:没有为Conduit配置信任决策者... 2010年8月11日下午6:26:16 org.apache.cxf.transport.http.HTTPConduit finalizeConfig 信息:没有为Conduit配置基本Auth供应商'... 2010年8月11日下午6:26:16 org.apache.cxf.transport.http.HTTPConduit准备 信息:分块设置为2048。 2010年8月11日下午6:26:16 org.apache.cxf.phase.PhaseInterceptorChain doIntercept 信息:拦截器抛出异常,现在解除 org.apache.cxf.interceptor.Fault:编组错误:com.systinet.wsdl.com.bmc.security.ess.webservice.holder.ArrayOfLog inPairHolder在这种情况下是未知的 at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:132) 在org.apache.cxf.jaxb.io.XMLStreamDataWriter.write(XMLStreamDataWriter.java:42) at 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) 在org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:122) 在$ Proxy44.login(未知来源) ... ......还有2个
更新于8月15日:
出于模块化和权宜之计的决定,将此代码放入单独的WAR项目中,该项目将提供其有限公司。服务,而不是暴露原始供应商的Web服务,这些服务太笨重了。
这个项目将是纯Java,并利用Metro 2.0.1运行时,大约16mb。
在清除lib和src / java文件夹之后,现在可以从Grails调用基于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, ... )
}