spring batch 在writer阶段不能注入bean 报空指针 其他的代码都能注入bean 5C
 package com.writer;

import java.util.List;

import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.Entity.UserEntity;
import com.Service.CommonCSVService;

@Component
public class CsvItemWriter implements ItemWriter<UserEntity> {

    @Autowired(required =false)
    private CommonCSVService commonCSVService;



    @Override
    public void write(List<? extends UserEntity> users){
        try{
            for(UserEntity user :users){
                System.out.println(user.getName()+"!!!!!!!!!!!!!!!!!!!!!");
                if(commonCSVService.insertToDB(user)){
                    System.out.println("CsvItemWriter :"+" insert successfully!");
                }else{
                    System.out.println("CsvItemWriter :"+" insert failed !");
                }
            }
        }catch(Exception e){
            System.out.println("CsvItemWriter: "+e);
        }
    }

}

我打了断点看了下这个bean commonCSVService是null,
但是

 package com.Mapper;
import java.util.Map;

import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindException;

import com.Entity.*;
import com.Service.CommonCSVService;
import com.Util.DateUtil;

@Component
public class CsvSetMapper implements FieldSetMapper<UserEntity>{

    @Autowired(required=true)
    @Qualifier("commonCSVService")
    private CommonCSVService commonCSVService;

    int lineNumber=1;

    Map<String, String> csvFileNameMap;

    String csvFilePathAndName;
    @Override
    public UserEntity mapFieldSet(FieldSet fieldSet) throws BindException {
        // TODO Auto-generated method stub

        UserEntity user;
        try{
            csvFileNameMap =commonCSVService.getJobParams();
            csvFilePathAndName =csvFileNameMap.get("csvFilePathAndName");
            System.err.println(csvFilePathAndName);

            //csv的结束行为9时 就不再继续读取了  可以用来统计文件的总行数(我这里不包括字段标记行)
            if(fieldSet!=null&&!fieldSet.readString(0).equals("9")){
                user =new UserEntity();
                user.setRecordType(fieldSet.readString(0));
                user.setLineNumber(lineNumber);
                user.setName(fieldSet.readString(1));
                user.setBirthday(DateUtil.parseDate(fieldSet.readString(2)));
                user.setChildren(fieldSet.readInt(3));
                lineNumber++;
                return user;
            }
              lineNumber=1;
        }catch (Exception ex){
            System.out.println("mapFieldSet :"+ex);
        }
        return null;
    }

}

这个commonCSVService 在setMapper这个阶段就有实例 不会报空指针
这是为什么 大神们 求解答

3个回答

commonCSVService 注入可能存在冲突,请检查是否重复注入

qq_33366229
小白鼠丶 其他的类都能用commonCSVService 这个bean
2 年多之前 回复
qq_33366229
小白鼠丶 这样怎么重复注入 而且我这个是在一个程序中 CsvItemWriter 这个类不能用commonCSVService
2 年多之前 回复
qq_33366229
小白鼠丶 <context:component-scan base-package="com" />
2 年多之前 回复
qq_33366229
小白鼠丶 应该没有重复注入我觉得 我的配置文件就只有一个<context:annotation-config />
2 年多之前 回复
qq_33366229
小白鼠丶 我也觉得可能是重复了 但是我不知道怎么检查 具体说说吗
2 年多之前 回复

这个其实不需要检查的,你在你的这个service类的注解上加上name,比如

@service("commonCSVService")
然后在这里注入的时候写
@Autowired
@Qualifier("commonCSVService")
如果还是报那个问题就证明你这个springbean中有两个相同名字的bean但是包不同,这时候一般都是修改自己的bean的name,因为你总不可能为了一个名字去修改框架中bean的name吧

qq_33366229
小白鼠丶 回复xuejiexiong: 还是不行我把项目clean install 了之后还是报那个错 我把项目所有代码发到博客上了 http://blog.csdn.net/qq_33366229/article/details/78711228时间看看 大哥
2 年多之前 回复
xuejiexiong
xuejiexiong 你第二个代码是对的不用改,把第一个改的跟二个一样就好了,加上@Qualifier("commonCSVService"),这样就可以注入进去了,还是不行建议清理一下项目应该就可以了,很有可能你没有选择自动编译吧
2 年多之前 回复
qq_33366229
小白鼠丶 按理来说在程序中斌没有一个commonCSVService 的bean了 但是还是报空指针, 第二个代码改成了commonCSVService1 还是包空指针 我就蒙了 哎
2 年多之前 回复
qq_33366229
小白鼠丶 然后第二个代码没有改 @Autowired @Qualifier("commonCSVService")
2 年多之前 回复
qq_33366229
小白鼠丶 上面我的代码 像你这样改了以后还是那个问题 我把bean name 改成了commonCSVService1
2 年多之前 回复
xuejiexiong
xuejiexiong 没注意到你的第二个代码,你的第二个代码就是因为指定了具体的bean的name所以才没有空
2 年多之前 回复

b/s做不到强制load的,除非一个有个请求在做这个工作,但是显然是不可能的。你可以将权限存在一个缓存中,超管修改其他用户权限时就根据ID把缓存中的数据修改,这样当用户刷新页面是这个权限就会起作用了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐