Java spring引导和spring批处理在ItemProcessor批处理的DAO中抛出NullPointerException
我在spring引导和spring批处理应用程序中遇到了问题,我分享了我的情况,我的层Dao是一个接口,它通过NPE(Java spring引导和spring批处理在ItemProcessor批处理的DAO中抛出NullPointerException,java,spring,spring-boot,spring-batch,Java,Spring,Spring Boot,Spring Batch,我在spring引导和spring批处理应用程序中遇到了问题,我分享了我的情况,我的层Dao是一个接口,它通过NPE(NullPointerException)实现,它有注释@Autowired,我用Junit进行了测试,以检查它是否正常工作,但我不知道我的配置工作或CustomItemProcces中存在错误。或者,这是我的代码,希望您能帮助我,谢谢 配置作业: @ComponentScan({"com.company.batch.config","com.company.batch.dao"
NullPointerException
)实现,它有注释@Autowired
,我用Junit进行了测试,以检查它是否正常工作,但我不知道我的配置工作或CustomItemProcces中存在错误。或者,这是我的代码,希望您能帮助我,谢谢
配置作业:
@ComponentScan({"com.company.batch.config","com.company.batch.dao","com.company.batch.mapper","com.company.batch.model","com.company.batch.particion","com.company.batch.procesos","com.company.batch.reader","com.company.batch.writers"})
public class ConfigJob
{
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("sqlserverDataSource")
private DataSource dataSource;
@Bean(name = "demoPartitionStep")
public Step step1Manager(Step slaveStep) {
return stepBuilderFactory.get("step1.manager")
.<String, String>partitioner("step1", demoPartitioner())
.step(slaveStep)
.gridSize(numerohilos())
.taskExecutor(taskExecutor())
.build();
}
@Bean(name = "demoPartitioner", destroyMethod = "")
public Partitioner demoPartitioner() {
RangePartitioner partitioner = new RangePartitioner();
//partitioner.setDataSource(dataSource);
// partitioner.partition(20);
return partitioner;
}
// slave step
@Bean
public Step slaveStep(ItemReader<beangenerico> demoReader)
{
return stepBuilderFactory.get("slaveStep")
.chunk(1)
//.reader(pagingItemReader(null, null))
.reader(demoReader)
.processor(compositeProcessor())
.writer(new ListDelegateWriter())
.build();
}
@Bean
public CompositeItemProcessor compositeProcessor() {
List<ItemProcessor> delegates = new ArrayList<>(3);
delegates.add(new CustomerItemProcessor());
delegates.add(new AccountsItemProcessor());
delegates.add(new beanDataItemProccesor());
CompositeItemProcessor processor = new CompositeItemProcessor();
processor.setDelegates(delegates);
return processor;
}
@Bean(name = "demoWriter")
@StepScope
public ItemWriter< beangenerico> CustomItemWriter() {
// TODO Auto-generated method stub
CustomItemWriter wri = new CustomItemWriter();
return wri;
}
@Bean(name = "demoReader")
@StepScope
public ItemReader<beangenerico> formiikreader(@Value("#{stepExecutionContext['fromId']}") int minValue,@Value("#{stepExecutionContext['toId']}") int maxValue){
myReader fr = new myReader(minValue,maxValue);
return fr;
}
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Job job(@Qualifier("demoPartitionStep") Step demoPartitionStep) {
return this.jobBuilderFactory.get("job")
.start(demoPartitionStep)
.build();
}
}
在这里
提前感谢在定义
CompositeItemProcessor
时,您正在自己创建CustomerItemProcessor
,这会导致其依赖bean无法注入并产生NPE。您应该从Spring上下文中获取CustomerItemProcessor
,而不是自己创建它。比如:
@Bean
公共复合处理器复合处理器(CustomerItemProcessor CustomerItemProcessor){
列表委托=新阵列列表(3);
添加(customerItemProcessor);
CompositeItemProcessor processor=新的CompositeItemProcessor();
处理器。设置委托(委托);
返回处理器;
}
这同样适用于
CompositeItemProcessor
的其他委托bean,如AccountsItemProcessor
等。好的,我发现问题是没有在配置中实例化bean,这里将我的解决方案放在code ConfigJob中,希望能帮助其他人
@ComponentScan({"com.company.batch.config","com.company.batch.dao","com.company.batch.mapper","com.company.batch.model","com.company.batch.particion","com.company.batch.procesos","com.company.batch.reader","com.company.batch.writers"})
public class ConfigJob
{
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("sqlserverDataSource")
private DataSource dataSource;
@Bean(name = "demoPartitionStep")
public Step step1Manager(Step slaveStep) {
return stepBuilderFactory.get("step1.manager")
.<String, String>partitioner("step1", demoPartitioner())
.step(slaveStep)
.gridSize(numerohilos())
.taskExecutor(taskExecutor())
.build();
}
@Bean(name = "demoPartitioner", destroyMethod = "")
public Partitioner demoPartitioner() {
RangePartitioner partitioner = new RangePartitioner();
//partitioner.setDataSource(dataSource);
// partitioner.partition(20);
return partitioner;
}
// slave step
@Bean
public Step slaveStep(ItemReader<beangenerico> demoReader)
{
return stepBuilderFactory.get("slaveStep")
.chunk(1)
//.reader(pagingItemReader(null, null))
.reader(demoReader)
.processor(compositeProcessor())
.writer(new ListDelegateWriter())
.build();
}
@Bean
public CompositeItemProcessor compositeProcessor() {
List<ItemProcessor> delegates = new ArrayList<>(3);
delegates.add(new CustomerItemProcessor());
delegates.add(new AccountsItemProcessor());
delegates.add(new beanDataItemProccesor());
CompositeItemProcessor processor = new CompositeItemProcessor();
processor.setDelegates(delegates);
return processor;
}
@Bean
public CustomerItemProcessor CustomerProccesor(){
return new CustomerItemProcessor();
}
@Bean
public AccountsItemProcessor AccountsItemProcessor(){
return new AccountsItemProcessor();
}
@Bean
public beanDataItemProccesor beanDataItemProccesor(){
return new beanDataItemProccesor();
}
@Bean(name = "demoWriter")
@StepScope
public ItemWriter< beangenerico> CustomItemWriter() {
// TODO Auto-generated method stub
CustomItemWriter wri = new CustomItemWriter();
return wri;
}
@Bean(name = "demoReader")
@StepScope
public ItemReader<beangenerico> formiikreader(@Value("#{stepExecutionContext['fromId']}") int minValue,@Value("#{stepExecutionContext['toId']}") int maxValue){
myReader fr = new myReader(minValue,maxValue);
return fr;
}
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Job job(@Qualifier("demoPartitionStep") Step demoPartitionStep) {
return this.jobBuilderFactory.get("job")
.start(demoPartitionStep)
.build();
}
}
@ComponentScan({“com.company.batch.config”、“com.company.batch.dao”、“com.company.batch.mapper”、“com.company.batch.model”、“com.company.batch.particion”、“com.company.batch.procesos”、“com.company.batch.reader”、“com.company.batch.writers”))
公共类配置作业
{
@自动连线
私人JobBuilderFactory JobBuilderFactory;
@自动连线
私人StepBuilderFactory StepBuilderFactory;
@自动连线
@限定符(“sqlserverDataSource”)
私有数据源;
@Bean(name=“demoPartitionStep”)
公共步骤step1Manager(步骤slaveStep){
返回stepBuilderFactory.get(“step1.manager”)
.partitioner(“步骤1”,demoPartitioner())
.步骤(slaveStep)
.gridSize(numerohilos())
.taskExecutor(taskExecutor())
.build();
}
@Bean(name=“demoPartitioner”,destromethod=”“)
公共分区器demoPartitioner(){
RangePartitioner partitioner=新的RangePartitioner();
//partitioner.setDataSource(数据源);
//分割器。分割器(20);
返回分区器;
}
//从动台阶
@豆子
公共步骤slaveStep(ItemReader demoReader)
{
返回stepBuilderFactory.get(“slaveStep”)
.chunk(1)
//.reader(pagingItemReader(null,null))
.reader(demoReader)
.processor(复合处理器())
.writer(新ListDelegateWriter())
.build();
}
@豆子
公共复合处理器复合处理器(){
列表委托=新阵列列表(3);
添加(新的CustomerItemProcessor());
添加(新AccountsItemProcessor());
添加(新BeanDateTemproccesor());
CompositeItemProcessor processor=新的CompositeItemProcessor();
处理器。设置委托(委托);
返回处理器;
}
@豆子
公共CustomerItemProcessor customerProcesor(){
返回新的CustomerItemProcessor();
}
@豆子
公共帐户站点处理器帐户站点处理器(){
返回新的AccountSiteProcessor();
}
@豆子
公共海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩海滩{
返回新的BeanDaitEmprocesor();
}
@Bean(name=“demoWriter”)
@步进镜
public ItemWriterCustomItemWriter(){
//TODO自动生成的方法存根
CustomItemWriter wri=新建CustomItemWriter();
返回wri;
}
@Bean(name=“demoReader”)
@步进镜
public ItemReader formiikreader(@Value(“{stepExecutionContext['fromId']}”)int-minValue,@Value(@Value(“{stepExecutionContext['toId']}”)int-maxValue){
myReader fr=新的myReader(最小值、最大值);
返回fr;
}
@豆子
公共任务执行器任务执行器(){
返回新的SimpleAsyncTaskExecutor(“spring_批”);
}
@豆子
公共作业作业(@Qualifier(“demoPartitionStep”)步骤demoPartitionStep){
返回此.jobBuilderFactory.get(“作业”)
.开始(demoPartitionStep)
.build();
}
}
public interface CustomerDAO {
ThreadLocal<CopyOnWriteArrayList<beanCustomer>> getAccAgentes(beangenerico bean);
}
@Repository("customerDAO")
public class CustomerDAOImpl implements CustomerDAO{
private String SP_SQL = "{call mysp(?, ?)}";
@Autowired
@Qualifier("sqlserverDataSource")
DataSource dataSource;
@Autowired
JdbcTemplate jdbcTemplate;
private ThreadLocal<CopyOnWriteArrayList<beanCustomer>> customerList2=new ThreadLocal<CopyOnWriteArrayList<beanCustomer>>();
private beanCustomer b = null;
public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> getAccAgentes(beangenerico bean) {
// TODO Auto-generated method stub
try {
customerList2.set(new CopyOnWriteArrayList<beanCustomer>());
System.out.println("entro a metodo");
if(getJdbcTemplate().getDataSource()!=null) {
System.out.println("success con"); //with junit test is ok
}else {
System.out.println("null conn");
}
return getJdbcTemplate().query(
SP_SQL,
new Object [] {bean.getIni(),bean.getFin()}, new ResultSetExtractor<ThreadLocal<CopyOnWriteArrayList<beanCustomer>>>() {
@Override
public ThreadLocal<CopyOnWriteArrayList<beanCustomer>> extractData(ResultSet rs)
throws SQLException, DataAccessException {
// TODO Auto-generated method stub
while(rs.next()){
b = new beanCustomer();
b.setIduser(rs.getString("iduser_co"));
b.setAccount(rs.getString("account_co"));
b.setTypeUser(rs.getString("type_idag"));
customerList2.get().add(b);
}
return customerList2;
}
});
}catch(Exception e) {}
System.out.println("size lista: "+customerList2.get().size());
return customerList2;
}
@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public JdbcTemplate getJdbcTemplate() {
if (null == jdbcTemplate) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
return jdbcTemplate;
}
}
2020-04-28 11:15:03 - Repeat is complete according to policy and result value.
entro a customitemprocessor
rangos:71-80
2020-04-28 11:15:03 - Applying contribution: [StepContribution: read=1, written=0, filtered=0, readSkips=0, writeSkips=0, processSkips=0, exitStatus=EXECUTING]
2020-04-28 11:15:03 - Rollback for RuntimeException: java.lang.NullPointerException: null
2020-04-28 11:15:03 - Initiating transaction rollback on application exception
java.lang.NullPointerException: null
at com.company.batch.procesos.CustomerItemProcessor.process(CustomerItemProcessor.java:69)
at com.company.batch.procesos.CustomerItemProcessor.process(CustomerItemProcessor.java:1)
at org.springframework.batch.item.support.CompositeItemProcessor.processItem(CompositeItemProcessor.java:63)
at org.springframework.batch.item.support.CompositeItemProcessor.process(CompositeItemProcessor.java:52)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.doProcess(SimpleChunkProcessor.java:134)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.transform(SimpleChunkProcessor.java:319)
at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:210)
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:77)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:407)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:331)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:273)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:258)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208)
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:138)
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler$1.call(TaskExecutorPartitionHandler.java:135)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:748)
2020-04-28 11:15:03 - Initiating transaction rollback
2020-04-28 11:15:03 - Rolling back resourceless transaction on [org.springframework.batch.support.transaction.ResourcelessTransactionManager$ResourcelessTransaction@1337e94]
2020-04-28 11:15:03 - Handling exception: java.lang.NullPointerException, caused by: java.lang.NullPointerException: null
2020-04-28 11:15:03 - Handling fatal exception explicitly (rethrowing first of 1): java.lang.NullPointerException: null
2020-04-28 11:15:03 - Encountered an error executing step slaveStep in job job
java.lang.NullPointerException: null
at com.company.batch.procesos.CustomerItemProcessor.process(CustomerItemProcessor.java:69)
at com.company.batch.procesos.CustomerItemProcessor.process(CustomerItemProcessor.java:1)
at org.springframework.batch.item.support.CompositeItemProcessor.processItem(CompositeItemProcessor.java:63)
listbean = customerDAO.getAccAgentes(rangos);
@ComponentScan({"com.company.batch.config","com.company.batch.dao","com.company.batch.mapper","com.company.batch.model","com.company.batch.particion","com.company.batch.procesos","com.company.batch.reader","com.company.batch.writers"})
public class ConfigJob
{
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("sqlserverDataSource")
private DataSource dataSource;
@Bean(name = "demoPartitionStep")
public Step step1Manager(Step slaveStep) {
return stepBuilderFactory.get("step1.manager")
.<String, String>partitioner("step1", demoPartitioner())
.step(slaveStep)
.gridSize(numerohilos())
.taskExecutor(taskExecutor())
.build();
}
@Bean(name = "demoPartitioner", destroyMethod = "")
public Partitioner demoPartitioner() {
RangePartitioner partitioner = new RangePartitioner();
//partitioner.setDataSource(dataSource);
// partitioner.partition(20);
return partitioner;
}
// slave step
@Bean
public Step slaveStep(ItemReader<beangenerico> demoReader)
{
return stepBuilderFactory.get("slaveStep")
.chunk(1)
//.reader(pagingItemReader(null, null))
.reader(demoReader)
.processor(compositeProcessor())
.writer(new ListDelegateWriter())
.build();
}
@Bean
public CompositeItemProcessor compositeProcessor() {
List<ItemProcessor> delegates = new ArrayList<>(3);
delegates.add(new CustomerItemProcessor());
delegates.add(new AccountsItemProcessor());
delegates.add(new beanDataItemProccesor());
CompositeItemProcessor processor = new CompositeItemProcessor();
processor.setDelegates(delegates);
return processor;
}
@Bean
public CustomerItemProcessor CustomerProccesor(){
return new CustomerItemProcessor();
}
@Bean
public AccountsItemProcessor AccountsItemProcessor(){
return new AccountsItemProcessor();
}
@Bean
public beanDataItemProccesor beanDataItemProccesor(){
return new beanDataItemProccesor();
}
@Bean(name = "demoWriter")
@StepScope
public ItemWriter< beangenerico> CustomItemWriter() {
// TODO Auto-generated method stub
CustomItemWriter wri = new CustomItemWriter();
return wri;
}
@Bean(name = "demoReader")
@StepScope
public ItemReader<beangenerico> formiikreader(@Value("#{stepExecutionContext['fromId']}") int minValue,@Value("#{stepExecutionContext['toId']}") int maxValue){
myReader fr = new myReader(minValue,maxValue);
return fr;
}
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Job job(@Qualifier("demoPartitionStep") Step demoPartitionStep) {
return this.jobBuilderFactory.get("job")
.start(demoPartitionStep)
.build();
}
}