Lavoro per un'azienda che utilizza XML per archiviare un gruppo di classi Java serializzate. Il framework che usiamo è Apache Betwixt (abbandono nel 2008) ed è un tipo di dolore da mantenere ed estendere ( sembrava una buona scelta nel corso della giornata).
Crash course in Betwixt insieme al problema dettagliato:
- Supporta solo getter e setter pubblici, devono essere presenti sia getter che setter
- Non supporta gli adattatori di tipo JAXB
- L'XML si evolve con gli oggetti Java, risultando in metodi ridondanti nelle nostre classi
Il nostro elenco di classi serializzabili xml ha superato i 150, e il codebase può diventare molto confuso quando vengono apportate modifiche alle definizioni. Poiché l'XML è vincolato a getter e setter Java, possiamo solo migrare XML mantenendo le vecchie proprietà nelle definizioni di classe.
Ora Dai un'occhiata a questa modifica:
public class ThingWithText {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
L'XML risultante assomiglia a:
<thingWithText>
<text>Whatever</text>
</thingWithText>
Ora considera una modifica nel modello per aggiungere più locale a ThingWithText
:
public class ThingWithText {
private List<TextWithLanguage> texts = new LinkedList<TextWithLanguage>();
// Getter must be here so the framework recognizes the property.
public String getText() {
return null;
}
// Has to be here so it can be serialized
public void setText(String text) {
this.texts.add(new TextWithLanguage(text));
}
public List<TextWithLanguage> getTexts() {
return texts;
}
public void addText(TextWithLanguage text) {
texts.add(text);
}
}
public class TextWithLanguage {
private Locale locale = // omitted;
private String text;
public TextWithLanguage(String text) {
this.text = text;
}
// Getter and setter omitted
}
L'XML ora assomiglia a:
<thingWithText>
<texts>
<text locale="en">Whatever</text>
</texts>
</thingWithText>
Ora l'XML non è brutto o altro, ma lascia comunque la classe ThingWithText
con diversi problemi:
- Un setter per un campo non esistente
- Un getter che restituisce sempre null, può causare eccezioni perché la roba è ancora compilata
Le mie domande vanno:
Abbiamo preso la decisione di fare qualcosa al riguardo e sembra un problema che potrebbero avere gli altri.
-
Come si gestisce la migrazione tra un vecchio framework come Betwixt in un nuovo (JAXB, Xstream, qualunque cosa)?
-
Se dovessimo mantenere il nostro framework: come possiamo gestire la notevole complessità del codice aggiunta dai metodi null e dai falsi setter?