构造函数类javax.xml.ws.Service中的服务无法应用于给定类型

时间:2013-05-29 13:20:01

标签: service jax-ws

我使用apache-cxf-2.7.4创建了一个Web服务。 我进入了项目中生成的课程。 我项目中的库是:

  • MATH3-公地3.2.jar
  • 的XStream-1.4.4.jar
  • JAXWS-API-2.2.5.jar

我有以下错误:

  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

3 个答案:

答案 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应用程序还是独立应用程序):

  1. 使用Java SE 7或Java EE 6。

  2. 使用参数wsdl2java重新运行-frontend jaxws21以生成符合JAX-WS 2.1的代码。

  3. 更改类加载器,首先加载应用程序中包含的类。

答案 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的帮助,虽然帖子很旧,但仍然很有帮助。)