我使用apache-cxf-2.7.4创建了一个Web服务。 我进入了项目中生成的课程。 我项目中的库是:
我有以下错误:
constructor Service in class javax.xml.ws.Service cannot be applied to given types;
required: java.net.URL,javax.xml.namespace.QName
found: java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[]
reason: actual and formal argument lists differ in length
答案 0 :(得分:10)
问题是JAX-WS API的版本。应用程序的类加载器首先加载了Java SE或Java EE中包含的版本。
对于Java SE 6或Java EE 5,JAX-WS API 2.1。 javax.xml.ws.Service
中的构造函数:
javax.xml.ws.Service.Service(URL, QName)
对于Java SE 7或Java EE 6,JAX-WS API 2.2。 javax.xml.ws.Service
中的构造函数:
javax.xml.ws.Service.Service(URL, QName)
javax.xml.ws.Service.Service(URL, QName, WebServiceFeature...) // You need this!
有三种可能的解决方案(取决于它是Web应用程序还是独立应用程序):
使用Java SE 7或Java EE 6。
使用参数wsdl2java
重新运行-frontend jaxws21
以生成符合JAX-WS 2.1的代码。
更改类加载器,首先加载应用程序中包含的类。
答案 1 :(得分:2)
如果使用Maven构建,则应将其添加到执行配置
<defaultOptions>
<extraargs>
<extraarg>-frontend</extraarg>
<extraarg>jaxws21</extraarg>
</extraargs>
</defaultOptions>
(感谢Paul Vargas指出我正确的方向)。
答案 2 :(得分:0)
wsimport -help告诉我们有关-target选项的信息。它说: 根据给定的JAXWS规范版本生成代码。默认值为2.2,可接受的值为2.0、2.1和2.2
如果您使用的是jdk wsimport工具,则只需添加-target参数,如下所示。
wsimport -keep -d \ myDirToStoreExtractedClientCode -target 2.1 \ myWSDLlocation \ mineNotYours.wsdl
(感谢Paul Vargas的帮助,虽然帖子很旧,但仍然很有帮助。)