简体   繁体   English

在Spring Batch中解密后通过MultiResourceItemReader读取文件

[英]Reading Files thru MultiResourceItemReader after de-cryption in Spring Batch

I'm developing a spring batch to read multiple files from a folder, process it and write the result in DB. 我正在开发一个Spring批处理,以从一个文件夹中读取多个文件,对其进行处理并将结果写入DB。 I'm using MultiResourceItemReader to read files from the folder. 我正在使用MultiResourceItemReader从该文件夹读取文件。 but the files might be encrypted so , i need to decrypt the file before reading. 但文件可能已加密,因此,我需要在读取文件之前对其进行解密。 What is the best way to do this? 做这个的最好方式是什么?

1) Should I use a step before reading, processing and writing ? 1)在阅读,处理和书写之前,我应该使用一个步骤吗? 2) Should I override doOpen from FlatFileItemReader which was set as delegate to MultiResourceItemReader ? 2)我应该从FlatFileItemReader重写doOpen,它被设置为MultiResourceItemReader的委托? 3) Should I override open in MultiResourceItemReader itself ? 3)我应该在MultiResourceItemReader自身中覆盖open吗?

I think, overriding an already existing method is not advisable, as we may end up in duplication or missing code. 我认为,不建议覆盖现有的方法,因为我们可能最终会出现重复或缺少代码的情况。 Please advise 请指教

I guess you are using a FlatFileItemReader as delegate here? 我想您在这里使用FlatFileItemReader作为代理

Then you could make it with a customized BufferedReaderFactory 然后,您可以使用自定义的BufferedReaderFactory

Java Code ( not tested! i have no experience using Cipher ) Java代码( 未经测试!我没有使用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;
  }
}

for algorithm see Java standard algorithms 有关算法,请参见Java标准算法

example bean configuration 示例Bean配置

<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Spring 使用MultiResourceItemReader 和使用ItemReadListener 批量读取文件 - Spring batch reading files with MultiResourceItemReader and using ItemReadListener Java Spring 批处理 - MultiResourceItemReader 不会在每次作业运行时读取新文件 - Java Spring Batch - MultiResourceItemReader not reading in new files every job run Spring批处理MultiResourceItemReader-仅用于合并文件? - Spring batch MultiResourceItemReader - only used for combining files? 如何使用 spring-batch 和 MultiResourceItemReader 读取文件夹中的所有文件? - How to read all files in a folder with spring-batch and MultiResourceItemReader? 每个资源的Spring Batch MultiResourceItemReader块提交 - Spring Batch MultiResourceItemReader Chunk Commit Per Resource 在 spring 批处理中,我们如何将处理后的文件移动到另一个文件夹,我正在使用 MultiResourceItemReader 和块处理 - In spring batch how can we move the processed files to another folder, I am using MultiResourceItemReader and chunk processing Spring 引导批处理 MultiResourceItemReader:如何使用 @Value() 从 jar 位置读取文件 - Spring boot batch MultiResourceItemReader: how to read files using @Value() from jar location Spring Boot批处理-MultiResourceItemReader:错误时移至下一个文件 - Spring Boot batch - MultiResourceItemReader : move to next file on error 春季批处理:具有自定义ItemReader的MultiResourceItemReader无限地读取同一文件 - Spring Batch: MultiResourceItemReader with custom ItemReader reads the same file ad infinitum Spring批处理读取多个具有动态名称的文件 - Spring Batch Reading Multiple files with Dynamic names
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM