我为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
答案 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文件夹中。