Status quo:
Per un prodotto software esistente (java) abbiamo creato un altro software (in java) che fornisce un servizio SOAP per molte di quelle chiamate disponibili, così possiamo costruire il nostro prodotto nel nostro linguaggio preferito python.
Sfortunatamente il codice legacy con cui devo lavorare ora non ha alcuna astrazione. Per ogni oggetto nel prodotto esistente abbiamo un oggetto mirror per il nostro servizio SOAP e un metodo Webservice.mapObject () che può convertire tra questi tipi di oggetto che impilano fino a 160 metodi molto simili con lo stesso nome in una singola classe di 3000 righe ( compresi ~ 180 istruzioni di importazione)
Ad esempio, i metodi mapObject()
per ServerTaskInfo
ha il seguente aspetto:
protected StructServerTaskInfo mapObject(ServerTaskInfo serverTaskInfo)
{
StructServerTaskInfo structServerTaskInfo = new StructServerTaskInfo();
if (serverTaskInfo != null)
{
if (serverTaskInfo.getErrorMessage() != null)
structServerTaskInfo.setErrorMessage(serverTaskInfo.getErrorMessage());
structServerTaskInfo.setResultCode(serverTaskInfo.getResultCode());
if (serverTaskInfo.getTaskIDs() != null) {
ArrayOfInteger taskIDs = new ArrayOfInteger();
taskIDs.getInteger().addAll(0, serverTaskInfo.getTaskIDs());
structServerTaskInfo.setTaskIDs(taskIDs);
}
}
return structServerTaskInfo;
}
protected ServerTaskInfo mapObject(StructServerTaskInfo structServerTaskInfo)
{
ServerTaskInfo serverTaskInfo = new ServerTaskInfo();
if (structServerTaskInfo != null)
{
if (structServerTaskInfo.getErrorMessage() != null)
serverTaskInfo.setErrorMessage(structServerTaskInfo.getErrorMessage());
serverTaskInfo.setResultCode(structServerTaskInfo.getResultCode());
if (structServerTaskInfo.getTaskIDs() != null)
serverTaskInfo.setTaskIDs(structServerTaskInfo.getTaskIDs().getInteger());
}
return serverTaskInfo;
}
E la corrispondente classe di mirror per SOAP è simile a questa (codice compresso per brevità):
package company.something.something.data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import company.something.something.ArrayOfInteger;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "StructServerTaskInfo", propOrder = {
"errorMessage", "resultCode", "taskIDs"
})
public class StructServerTaskInfo
{
protected String errorMessage;
protected int resultCode;
protected ArrayOfInteger taskIDs;
public String getErrorMessage() { return errorMessage; }
public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }
public int getResultCode() { return resultCode; }
public void setResultCode(int resultCode) { this.resultCode = resultCode; }
public ArrayOfInteger getTaskIDs() { return taskIDs; }
public void setTaskIDs(ArrayOfInteger taskIDs) { this.taskIDs = taskIDs; }
}
Ci sono più di 100 di queste classi di mirror, non tutte hanno un metodo mapObject()
.
Lavoro:
( Nota: Non sono un programmatore Java esperto. Ho usato codice in php e python per gli ultimi 5 anni. Quindi la mia conoscenza delle funzionalità Java e dei grandi pacchetti Java è molto limitata e questo è la prima volta che lavoro con il protocollo SOAP)
Mi piacerebbe trovare un modo generico che mi permetta di inviare e ricevere qualsiasi oggetto tramite SOAP. Considero l'utilizzo di Reflection e Generics per creare le mie classi JavaToWsdl
e WsdlToJava
che tradurranno gli oggetti e chiameremo i suoi metodi in modo da non dover creare una nuova classe per ogni classe del software originale (Does un tale strumento esiste già?). Questo è possibile anche in Java 1.6 o 1.8?
Ho esaminato la serializzazione in Java, ma ciò non sembra essere quello di cui ho bisogno. Anche se potrei salvare poche centinaia di righe di codice. x-stream sembra essere meglio, ma non so se l'XML risultante sarà leggibile da un client scritto in python .
Non sto cercando necessariamente una soluzione completa qui, ma per qualche consiglio e ispirazione su come affrontare questo problema.
Grazie mille in anticipo!