【问题标题】:Why is wsimport generating "incomplete" classes?为什么 wsimport 会生成“不完整”的类?
【发布时间】:2013-08-22 04:46:32
【问题描述】:

首先,我将概述情况。我不会列出我项目的每一类,只列出我认为相关的那些。如果您觉得缺少什么,请告诉我,我会补充。

2 个项目:

WS

Client

5 个类(它们属于 WS):

Main.java

User.java

ModuleMain

ModuleSecondary.java

ModuleEmergency.java

User 类具有以下字段:

String username

String password

ModuleMain main

ModuleSecondary secondary

ModuleEmergency emergency

每个“模块”类都有 3 个布尔字段,它们是访问模块的权限。它们是:

boolean canMonitor

boolean canAdd

boolean canRemove

这是 WS 类。此类是发布端点的类:

        Endpoint endpoint = Endpoint.create(new UserWs());
        //UserWs would be a WebService.
        SSLContext ssl = SSLContext.getInstance("SSLv3");

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        KeyStore jks = KeyStore.getInstance("PKCS12");

        jks.load(new FileInputStream(path), pwField.getText().toCharArray());

        kmf.init(jks, pwField.getText().toCharArray());
        KeyManager[] keyManagers = kmf.getKeyManagers();

        tmf.init(jks);

        TrustManager[] trustManagers = tmf.getTrustManagers();

        ssl.init(keyManagers, trustManagers, new SecureRandom());

        HttpsConfigurator configurator = new HttpsConfigurator(ssl);

        server = HttpsServer.create(new InetSocketAddress("localhost", 443), 443);
        server.setHttpsConfigurator(configurator);

        HttpContext context = server.createContext("/ws");
        server.start();

        endpoint.publish(context);

运行 WebService 后,我使用 wsimport 工具将类放入 Clientproject。

wsimport -verbose -Xdebug -keep -p ws.api https://localhost:443/ws?wsdl

这些是我得到的一些课程:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {
"moduleMain",
"moduleSecondary",
"moduleEmergency",
"sessionKey",
"username"
})
public class User {

protected ModuleMain main;
protected ModuleSecondary secondary;
protected ModuleEmergency emergency;
protected String username;

//...getters and setters for those fields...//
}

如您所见,密码字段被省略了。但这真的不是问题,问题是生成的Module 类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "main")
public class ModuleMain {


}

就是这样。其他Module 类是同样的事情。他们没有任何方法,所以我无权访问权限字段。我不知道是什么问题,可能是 WSDL,但我不知道如何解决这个问题。

非常感谢任何帮助。抱歉语法错误。

【问题讨论】:

    标签: java web-services wsdl jax-ws wsimport


    【解决方案1】:

    问题可能是两种情况之一 - (A) 从 Java 优先的 Web 服务生成的 WSDL 没有捕获所有需要的字段,或者 (B) 后续的 wsdl-to-java wsimport 过程没有正确读取 WSDL。您是否通过查看 WSDL 确定了它是哪一个?如果是 A,您应该向我们展示生成的 WSDL 并询问为什么缺少重要字段(而不是向我们展示随后由 WSDL 生成的工件——这不再重要,因为问题不存在)如果是 B,则显示我们使用 WSDL 并忘记您为生成它所做的工作,然后询问为什么在 wsimport 过程中缺少这些字段。由于不提供 WSDL,我们无法轻松确定问题出在 (A) 还是 (B) 中。注意我博客上的articles 2 and 3 可能对你有帮助。

    【讨论】:

    • 现在生成正确。原来这是 getter 和 setter 的问题......我的意思是,我有一个名为 canRemove() 的方法。只需将其重命名为 isCanRemove() 甚至 getCanRemove() 就可以了。我觉得奇怪的是,我有一个来自用户类的密码字段的 getter 和 setter。但是,setter 有额外的操作,它不是简单的this.password = value。我会看文章,只是觉得值得一提。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多