NetBeans Web服务客户端存根 - 不兼容的类型?

时间:2011-05-18 03:09:52

标签: java web-services netbeans jax-ws

我为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

3 个答案:

答案 0 :(得分:3)

该工具生成的类与您拥有的类不同。因此,您必须使用客户端生成的工具与Web服务进行通信。您无法将其替换为您为服务器端编写的那些。

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

将以下内容添加到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服务引用和右键单击 - &gt;刷新......服务。

您要使用的LogMessage类将显示在客户端的Generated Sources文件夹中。