为什么wsimport会生成“不完整”类?

时间:2013-08-22 04:46:32

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

首先,我会概述一下情况。我不会列出我项目的每一个类别,只列出我认为相关的项目。如果你觉得缺少某些东西,请告诉我,我会补充一下。

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

每个“Module”类都有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工具将类导入Client项目。

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,但我不知道如何解决这个问题。

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

1 个答案:

答案 0 :(得分: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可能会对您有所帮助。