【问题标题】:NetBeans webservice client stubs - incompatible type?NetBeans Web 服务客户端存根 - 不兼容的类型?
【发布时间】:2011-05-18 03:09:52
【问题描述】:

我为 NetBeans Web 服务生成了客户端存根。

webservice 实现使用我项目中的本地 POJO。生成的存根已创建此 POJO 的修订版以供使用。当我使用服务时,我想使用原始的POJO,而不是生成的类型..?类型转换不起作用。

即(注意包裹)

package adiib.ws.harmoniser;

@WebMethod(operationName = "getStartupLogMessages")
public ArrayList<LogMessage> getStartupLogMessages() {
    return startupLogMessages;
}

POJO LogMessage 内容如下:

package adiib.shared;

public class LogMessage implements Serializable 
{    
    private static final long serialVersionUID = 8379681391654158512L;

    private String exceptionMessage;
    private String customMessage;
    private String stackTrace;
    private LogMessageEnum classification;
    private String effectiveTime;
    private String exceptionClassName;
    private String throwerClassName;

    public LogMessage(){}

    public LogMessage(String exceptionMessage, String customMessage,
        String stackTrace, LogMessageEnum classification, String effectiveTime,
        String exceptionClassName, String throwerClassName)
    {
        this.exceptionMessage = exceptionMessage;
        this.customMessage = customMessage;
        this.stackTrace = stackTrace;
        this.classification = classification;
        this.effectiveTime = effectiveTime;
        this.exceptionClassName = exceptionClassName;
        this.throwerClassName = throwerClassName;
    }

    public String getCustomMessage() {
        return customMessage;
    }

    public void setCustomMessage(String customMessage) {
        this.customMessage = customMessage;
    }

    public String getExceptionMessage() {
        return exceptionMessage;
    }

    public void setExceptionMessage(String exceptionMessage) {
        this.exceptionMessage = exceptionMessage;
    }

    public LogMessageEnum getClassification() {
        return classification;
    }

    public void setClassification(LogMessageEnum classification) {
        this.classification = classification;
    }

    public String getEffectiveTime() {
        return effectiveTime;
    }

    public void setEffectiveTime(String effectiveTime) {
        this.effectiveTime = effectiveTime;
    }

    public String getStackTrace() {
        return stackTrace;
    }

    public void setStackTrace(String stackTrace) {
        this.stackTrace = stackTrace;
    }

    public String getExceptionClassName() {
        return exceptionClassName;
    }

    public void setExceptionClassName(String exceptionClassName) {
        this.exceptionClassName = exceptionClassName;
    }

    public String getThrowerClassName() {
        return throwerClassName;
    }

    public void setThrowerClassName(String throwerClassName) {
        this.throwerClassName = throwerClassName;
    }    
}

现在,在客户端,当我尝试像这样使用 webservice 方法时:

package adiib.server;

private void getStartupLogMessages() {

private static List<LogMessage> logMessages = new ArrayList<LogMessage>();

    dsto.adiib.ws.client.harmoniser.AdiibHarmoniser_Service service = new dsto.adiib.ws.client.harmoniser.AdiibHarmoniser_Service();
    dsto.adiib.ws.client.harmoniser.AdiibHarmoniser port = service.getAdiibHarmoniserPort();

    List<dsto.adiib.ws.client.harmoniser.LogMessage> startupLogMessages = port.getStartupLogMessages();
    for (adiib.ws.client.harmoniser.LogMessage logMessage : startupLogMessages) {
        /* 
         * this fails becuase it's looking for adiib.ws.client.harmoniser.LogMessage
         * not adiib.shared.LogMessage; adiib.ws.client.harmoniser.LogMessage is the
         * generated type..
         */
        logMessages.add((LogMessage) logMessage);
    }
}

有什么想法吗?我能想到的只是创建一个转换方法..这似乎是错误的。

WulfgarPro

【问题讨论】:

    标签: java web-services netbeans jax-ws


    【解决方案1】:

    该工具生成的类与您拥有的原始类不同。因此,您必须使用客户端生成的工具与 Web 服务进行通信。您不能用您为服务器端编写的替换它。

    例如,考虑 JAX-WS 构建的客户端 DTO。如果您打开源代码,您将看到自动生成的(使用wsimport)包含可能不存在于服务器端类中的注释(除非您手动编写)。因此,据我了解,您必须使用工具生成的工具。

    您可能必须编写方法来将您的 DTO 转换为在调用 Web 服务之前生成的工具。如果您生成的类具有相同的属性集(在生成客户端 DTO 时工具没有更改类型和命名),那么您可能可以使用类似 Apache Commons BeanUtils(参见http://commons.apache.org/beanutils/)来帮助转换。您只需调用 BeanUtils.copyProperties() 并传入您的源 DTO(您自己的类型)和目标 DTO(WS 生成)并对其进行转换。

    【讨论】:

      【解决方案2】:

      没错,为存根生成的类是 POJO 类的图像。 生成它们是为了从远程服务器传输数据。

      您必须使用 setter/getter 并在 POJO 上调整数据。

      您的方法需要包装在属于服务类的另一个方法中。 (称之为 MyClassServiceImpl)

      并在您的应用程序实现中调用该方法。

      【讨论】:

        【解决方案3】:

        将以下内容添加到您的 LogMessage 类(在服务中):

            import javax.xml.bind.annotation.XmlAccessType;
            import javax.xml.bind.annotation.XmlAccessorType;
            import javax.xml.bind.annotation.XmlElement;
            import javax.xml.bind.annotation.XmlType;
        
            @XmlAccessorType(XmlAccessType.FIELD)
            @XmlType(name = "LogMessage")
            public class LogMessage implements Serializable 
            { ... }
        

        重建服务器。 在您的客户端应用程序中,转到 Web 服务引用并右键单击 -> 刷新...服务。

        您要使用的 LogMessage 类随后将出现在客户端的 Generated Sources 文件夹中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-02
          • 1970-01-01
          • 1970-01-01
          • 2013-10-07
          • 2014-09-04
          相关资源
          最近更新 更多