Usando Apache Camel, Smooks e Flatpack
-
30-10-2019 - |
Domanda
Sto scrivendo un percorso usando Camel e Smooks, con il produttore come repository JPA che produce un elenco di oggetti JPA, che devo inviare a un server SFTP come file di larghezza fissa.
Ecco cosa penso sia necessario per questo
- Il repository che utilizza JPA per produrre un elenco di oggetti (ho questo)
- Una mappatura da Smooks to Flatpack che prende la versione XML dell'elenco sopra menzionato e la trasforma in un file di larghezza fissa
- Un percorso di cammello che inizia con il repository e termina con il file invio tramite SFTP:
Ecco il codice che ho per questo:
public class RetirementRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
onException(Throwable.class)
.maximumRedeliveries(3)
.useExponentialBackOff()
.backOffMultiplier(4)
.logRetryAttempted(true)
.handled(true)
.log(LoggingLevel.ERROR, "Error transmitting file to miliman")
.to("log:org.fuwt?level=ERROR&showAll=true");
//define the fixed width mapping
FlatpackDataFormat df = new FlatpackDataFormat();
df.setDefinition(new ClassPathResource("META-INF/smooks/fuintegration/retirement-fixed-width-mapping.xml"));
df.setFixed(true);
df.setIgnoreFirstRecord(false);
from("bean:retirementRepository?method=getRetirementMembers")
.to("log:org.fuwt?level=INFO")
.transacted("CRM_PROPAGATION_REQUIRED")
.routeId("retirement_member_exchange")
.aggregate(property("CamelCreatedTimestamp"), new RetirementAggregationStrategy()).completionFromBatchConsumer()
.marshal(df).log("log:org.fuwt?level=ERROR&showAll=true")
.to("file://Users/smohamed/tests/?fileName=marshal.test.txt");
}
}
Tuttavia, quando eseguo un test unitario, ricevo il seguente errore:
ArrayList cannot be converted to RetirementMember
Il che penso significhi che Flatpack non sa cosa fare con l'elenco e deve lavorare su un oggetto per oggetto.
Quindi, quello che sto cercando è una mappatura Smooks simile al modello Freemaker, ma invece di un modello Freemaker, voglio usare le definizioni delle colonne di Flatpack:
<?xml version='1.0'?>
<!DOCTYPE PZMAP SYSTEM "flatpack.dtd" >
<PZMAP>
<COLUMN name="ssn" length="11" />
<COLUMN name="lastName" length="20" />
<COLUMN name="firstName" length="15" />
</PZMAP>
Qual è il modo migliore per farlo? Non c'è molta documentazione disponibile e cerco da settimane
Grazie
Sam
Nessuna soluzione corretta