Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.xml.ws.WebServiceException:方法X作为WebMethod公开,但没有相应的wsdl操作_Java_Web Services_Soap_Wsdl_Jax Ws - Fatal编程技术网

javax.xml.ws.WebServiceException:方法X作为WebMethod公开,但没有相应的wsdl操作

javax.xml.ws.WebServiceException:方法X作为WebMethod公开,但没有相应的wsdl操作,java,web-services,soap,wsdl,jax-ws,Java,Web Services,Soap,Wsdl,Jax Ws,我正在使用JAX-WSRI与第三方web服务(Adyen)集成。我下载了他们的wsdl副本,并在构建中使用jaxws:wsdl2java生成web服务实现源代码。在运行时,当我试图通过调用自动生成的支付服务类的getPort()方法来设置端口时,我得到以下异常,声称有一个方法已公开,但它不存在于wsdl portType元素中: javax.xml.ws.WebServiceException: Method adjustAuthorisation is exposed as WebMethod

我正在使用JAX-WSRI与第三方web服务(Adyen)集成。我下载了他们的wsdl副本,并在构建中使用
jaxws:wsdl2java
生成web服务实现源代码。在运行时,当我试图通过调用自动生成的支付服务类的getPort()方法来设置端口时,我得到以下异常,声称有一个方法已公开,但它不存在于wsdl portType元素中:

javax.xml.ws.WebServiceException: Method adjustAuthorisation is exposed as WebMethod, but there is no corresponding wsdl operation with name {http://payment.services.adyen.com}adjustAuthorisation in the wsdl:portType{http://payment.services.adyen.com}PaymentPortType
但是,它存在于portType元素中。以下是wsdl的相关片段:

    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:265) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:246) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:209) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:178) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:363) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:321) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:211) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:207) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:114) ~[jaxws-rt.jar:2.2.10]
    at javax.xml.ws.Service.<init>(Service.java:77) ~[?:1.8.0_252]
    at com.amazon.adyen.payment.Payment.<init>(Payment.java:58) ~[?:?]

...
完整的wsdl可以在这里看到:

wsdl包含在带有classpath/wsdl/Payment.wsdl的目标jar中。我在运行时在config类中使用以下代码加载它:

URL wsdl=getClass().getResource(wsdlLocation);
onlineService=新支付(wsdl,新QName(serviceUrl,serviceName));
其中
serviceUrl=”http://payment.services.adyen.com“
和与wsdl匹配的
serviceName=“Payment”

最后,这里是我试图打开端口并最终获得异常的代码片段:

ClassLoader oldClassLoader=Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
尝试
{
port=config.getOnlineService().getPaymentHttpPort();//此处引发异常
}
最后
{
Thread.currentThread().setContextClassLoader(oldClassLoader);
}

你知道为什么它似乎误读了wsdl吗?另一个潜在的重要信息是,我最近更新了wsdl,以前我的应用程序使用Adyen的API版本12和相应的wsdl,现在我正在升级到版本30。应用程序使用之前相同的代码运行良好。

用于生成类的wsdl文件与运行时加载的wsdl文件不匹配

  • 这些类是使用较新版本生成的,因为错误提到WebMethod
    AdjustAuthorization

  • 运行时加载的wsdl是旧版本,它不包含
    adjustAuthorization
    方法
注意
v30
v12
之间的区别:
javax.xml.ws.WebServiceException的堆栈跟踪显示了在使用wsdl生成的代码构造新的
支付
服务时发生的情况:

    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:265) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:246) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:209) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:178) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:363) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:321) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:211) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:207) ~[jaxws-rt.jar:2.2.10]
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:114) ~[jaxws-rt.jar:2.2.10]
    at javax.xml.ws.Service.<init>(Service.java:77) ~[?:1.8.0_252]
    at com.amazon.adyen.payment.Payment.<init>(Payment.java:58) ~[?:?]
如果能够直接加载输入流,则可以执行以下操作,而无需触及可能影响其他连接的默认缓存行为:

URL wsdl=getClass().getResource(wsdlLocation);
URLConnection=wsdl.openConnection();
connection.setUseCaches(false);
InputStream InputStream=connection.getInputStream();

这也是我从错误消息中获得的信息,但我不确定如何调试或修复它。v30 wsdl内置到jar中,然后由配置类中的类路径引用。我已经通过解压检查了已部署的jar,并验证了V30WSDL是否按预期包含。可能在类路径的某个地方有该资源的另一个版本。您可以记录wsdl URL以确保从正确的jar中提取正确的wsdl吗?(即此值:
URL wsdl=getClass().getResource(wsdlLocation);
)我已部署了一个更改来记录此行,结果是
jar:file:/[project root]/lib/[project name]-1.0.jar/wsdl/Payment.wsdl
。我不确定这是否完全消除了缓存值的可能性,因为它不是绝对的文件引用。在创建端口之前,请尝试将此
new java.util.Scanner(config.getOnlineService().getWSDLDocumentLocation().openStream(),“UTF-8”).findWithinHorizon(java.util.regex.Pattern.compile(“]*>”,1000000)
。它将读取服务正在使用的wsdl并查找特定行。所需的输出是
我发现这是由于
URLConnection
缓存…通过打开到wsdl URL的连接并调用
connection.setDefaultUseCaches(false)
wsdl被迫从磁盘而不是缓存加载。阅读您的问题后,不清楚您正在使用哪个web服务框架。一方面,您表示JAXWS-RI,但是
wsdl2java
是一个CXF任务。请你澄清这一点好吗?您能否在问题中包括
pom.xml
中的
wsdl2java
任务描述?这方面有什么进展吗?请按照我之前的评论,你能扩展你的问题吗?我认为这对解决这个问题会有很大帮助。