Окурки клиента веб-службы NetBeans - несовместимый тип? - PullRequest
2 голосов
/ 18 мая 2011

Я создал свои заглушки на стороне клиента для веб-службы NetBeans.

Реализация веб-сервиса использует локальный 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 ]

3 голосов
/ 05 июня 2011

Классы, сгенерированные инструментом, не совпадают с теми, которые у вас есть.Таким образом, вы должны использовать инструмент, созданный на стороне клиента, для взаимодействия с веб-сервисом.Вы не можете заменить его на те, которые вы написали для своей серверной части.

Например, рассмотрим встроенные в JAX-WS клиентские DTO.Если вы откроете исходный код, вы увидите, что автоматически сгенерированные (с использованием wsimport) содержат аннотации, которые могут отсутствовать (если вы не написали вручную) в ваших классах на стороне сервера.Поэтому, насколько я понимаю, вы должны идти с инструментами, созданными.

Возможно, вам придется написать методы для преобразования ваших DTO в инструмент, сгенерированный до вызова веб-службы.Если ваши сгенерированные классы имеют одинаковый набор свойств (тип и наименование не были изменены инструментом при создании клиентских DTO), то, вероятно, вы могли бы использовать что-то вроде Apache Commons BeanUtils (см. http://commons.apache.org/beanutils/), чтобы помочь в преобразовании.Вы можете просто вызвать BeanUtils.copyProperties() и передать исходный DTO (ваш собственный тип) и целевой DTO (сгенерированный WS) и преобразовать его.

2 голосов
/ 30 мая 2011

Вы правы, сгенерированный класс для заглушки - это изображения классов POJO.Они генерируются для передачи данных с удаленного сервера.

Вы должны использовать установщик / получатель и адаптировать данные в вашем POJO.

Ваш метод должен быть упакован в другой метод, принадлежащий сервисуучебный класс.(назовите его MyClassServiceImpl)

и вызовите метод в реализации вашего приложения.

0 голосов
/ 31 августа 2011

Добавьте следующее к вашему классу 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 
    { ... }

Перестройте сервер.В своем клиентском приложении перейдите в Ссылки на веб-службы и щелкните правой кнопкой мыши -> Обновить ... службу.

Класс LogMessage, который вы хотите использовать, появится в папке «Сгенерированные источники» клиента.

...