2016-03-23 2 views
0

Ich entwickle einen Spring-Batch, um mehrere Dateien aus einem Ordner zu lesen, zu verarbeiten und das Ergebnis in DB zu schreiben. Ich verwende MultiResourceItemReader, um Dateien aus dem Ordner zu lesen. aber die Dateien sind möglicherweise so verschlüsselt, dass ich die Datei vor dem Lesen entschlüsseln muss. Was ist der beste Weg, dies zu tun?Lesen von Dateien durch MultiResourceItemReader nach der Entschlüsselung in Spring Batch

1) Sollte ich einen Schritt vor dem Lesen, Bearbeiten und Schreiben verwenden? 2) Sollte ich doOpen von FlatFileItemReader überschreiben, das als Delegate für MultiResourceItemReader gesetzt wurde? 3) Sollte ich Open in MultiResourceItemReader selbst überschreiben?

Ich denke, es ist nicht ratsam, eine bereits existierende Methode außer Kraft zu setzen, da dies zu Doppelarbeit oder fehlendem Code führen kann. Bitte beraten Sie

Antwort

0

Ich denke, Sie verwenden eine FlatFileItemReader als Delegierter hier?

Dann könnte man es macht mit einem maßgeschneiderten BufferedReaderFactory

Java-Code (nicht getestet! Ich habe keine Erfahrung mit Cipher)

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.UnsupportedEncodingException; 

import javax.crypto.Cipher; 
import javax.crypto.CipherInputStream; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 
import javax.crypto.spec.IvParameterSpec; 

import org.springframework.batch.item.file.BufferedReaderFactory; 
import org.springframework.core.io.Resource; 

public class EncryptedBufferedItemReaderFactory implements BufferedReaderFactory { 

    private String keyFile; 
    private String algorithm; 

    @Override 
    public BufferedReader create(final Resource resource, final String encoding) throws UnsupportedEncodingException, IOException { 
    FileInputStream fis = new FileInputStream(resource.getFile()); 
    CipherInputStream cis = new CipherInputStream(fis, createCipher()); 
    return new BufferedReader(new InputStreamReader(cis, encoding)); 
    } 

    private Cipher createCipher() throws IOException, FileNotFoundException { 
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(keyFile)); 
    Cipher cipher; 
    try { 
     DESKeySpec ks = new DESKeySpec((byte[]) ois.readObject()); 
     SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); 
     SecretKey key = skf.generateSecret(ks); 
     cipher = Cipher.getInstance(algorithm); 
     cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec((byte[]) ois.readObject())); 
    } catch (Exception ex) { 
     throw new IOException(ex); 
    } finally { 
     ois.close(); 
    } 
    return cipher; 
    } 

    public void setKeyFile(final String keyFile) { 
    this.keyFile = keyFile; 
    } 

    public void setAlgorithm(final String algorithm) { 
    this.algorithm = algorithm; 
    } 
} 

für Algorithmus Java standard algorithms

Beispiel Bohnen Konfiguration sehen

<bean id="multiResourceItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step"> 
    <property name="resources" value="#{jobParameters['whateverYouChosen']}" /> 
    <property name="delegate" ref="flatFileItemReader" /> 
</bean> 

<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> 
    <!-- some properties you already have, like lineMapper --> 
    <property name="bufferedReaderFactory" ref ="encryptedBufferedReaderFactory" /> 
</bean> 

<bean id="encryptedBufferedReaderFactory" class="your.com.package.EncryptedBufferedReaderFactory" scope="step"> 
    <property name="keyFile" value="#{jobParameters['pathToKeyFile']}" /> 
    <property name="algorithm" value="#{jobParameters['algorithm']}" /> 
</bean>