wsimport生成的代码存在问题

3

我使用wsimport生成我的Java存根文件。为此,我在Eclipse中使用一个ant构建文件:

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
    <classpath>
        <fileset dir="../lib">
            <include name="jaxws-tools.jar" />
        </fileset>
    </classpath>
</taskdef>

<target name="generate">
    <wsimport wsdl="../wsdl/Knowledgebase.wsdl"
              destdir="../bin"
              sourcedestdir="../gen"
              keep="true"
              xendorsed="true">
    </wsimport>
</target>

任务运行时没有出现任何错误。它创建了不同的java文件,包括Knowledgebase.java和KnowledgebasePort.java。在Knowledgebase.java中,有以下构造函数:
public Knowledgebase(WebServiceFeature... features) {
    super(__getWsdlLocation(), KNOWLEDGEBASE_QNAME, features);
}

当我为他们运行时,出现错误“构造函数Service(...)未定义”。我已导入当前的jax-ws jar文件。我的生成过程是否有问题,我是否使用了错误的jar文件或者错误在哪里?

3个回答

4

Service对象由Java EE SDK提供。在Java EE 5和Java EE 6之间,它增加了一个新的构造函数。看起来您使用的wsimport来自Java EE 6 JDK,编译器正在使用Java EE 5 SDK?


我担心这个版本有冲突 :-( 在我的项目设置中,我已将Java编译器>编译器兼容级别设置为1.6。还有哪里可能不匹配? - strauberry
这是在Eclipse中吗?看起来你也在使用Ant。为了使用wsimport,你需要用taskdef定义它。你能发一下taskdef吗?你用什么作为classpath? - Pace
1
为了让JDK使用不同的版本,您需要将新的API Jars添加到JDK本身中,您可以将这些Jars添加到认可目录。即<JAVA_HOME>/jre/lib/endorsed。我已经在该目录中放置了jaxb-api和jaxws-api。 - Michael Wiles

2
如果我们使用的是例如Java 1.6.0_27和Metro 2.2,我们需要认可webservices-api.jar。
  1. 我们必须将此jar放入文件夹java-install-dir\jre\lib\endorsed\中。
  2. 如果使用Eclipse,则必须确保我们正在使用来自目录java-install-dir的正确JRE。这可以在Window->Preferences->Java->Installed JREs->Add中完成。
现在错误 "The constructor Service(...) is undefined" 应该消失了。

1

你可以设置 xendorsed="true" 和 xnocompile="false",让 ant 编译生成的 Java 文件。这对我很有效。

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport">
        <classpath>
            <fileset dir="${ext.myproject.path}/lib">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="${platformhome}/resources/ant/lib">
                <include name="*.jar"/>
            </fileset>
        </classpath>    
</taskdef>

<macrodef name="myproject_before_compile_core">
        <sequential>
            <mkdir dir="${ext.myproject.path}/gensrc"/>
            <mkdir dir="${ext.myproject.path}/classes"/>
            <echo message="Generating WS stubs for Simulate BOM Service"/>
            <wsimport wsdl="${ext.myproject.path}/resources/wsdl/service.wsdl" package="com.xx.energy.yy.xyz.ws.stubs.service" xnocompile="false" destdir="${ext.myproject.path}/classes" sourcedestdir="${ext.myproject.path}/gensrc" keep="true" wsdlLocation="${ext.myproject.path}/resources/wsdl" xendorsed="true">
                <produces dir="${ext.myproject.path}/gensrc/com/xx/energy/yy/xyz/ws/stubs/service">
                    <include name="*.java"/>
                </produces>
                <depends file="${ext.myproject.path}/resources/wsdl/service.wsdl"/>
            </wsimport>
        </sequential>
    </macrodef>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接