关于Mybaits持久化问题

为毛我名叫酱油 发布于 2016/05/25 19:58
阅读 499
收藏 0

@黄亿华 你好,想跟你请教个问题:

首先上代码:

public class SaveSqlPipeline implements Pipeline {

    public SaveSqlPipeline(Date date, Employer employer) {
        this.date = date;
        this.employer = employer;
    }

    private Date date;
    private Employer employer;
    @Override
    public void process(ResultItems resultItems, Task task) {
        // TODO Auto-generated method stub
        System.out.println("get page: " + resultItems.getRequest().getUrl());
        PdfFile pdfFile = (PdfFile) resultItems.get("pdffile");
        pdfFile.setDate(date);
        String pdfId = employer.getEmpname()
                + new DateUtil().getDateTime("yyyyMMdd", date)
                + new common().getNumFromString(pdfFile.getPdfTitle());
        pdfFile.setId(pdfId);
        pdfFile.setIdEmp(employer.getId());
        ranking rank =new ranking();
        rank.setFileId(pdfId);
        rank.setTime(date);
        rank.setClicknum(0);
        new OperationDBData().SaveWebmagicData(date, pdfFile, rank, "SaveSqlPipeline.class");
    }
}

我的定制的Pipeline是这样写的,现在有一个问题:就是数据正常可以取到,我打印到控制台数据都在,但是每次在保存数据的时候报空指针错误

错误代码:

  get page: http://epaper.gmw.cn/gmrb/html/2015-05/30/nbs.D110000gmrb_12.htm
[ERROR]  05-2519:19:37[us.codecraft.webmagic.Spider-326][pool-1-thread-1][3934] - process request Request{url='http://epaper.gmw.cn/gmrb/html/2015-05/30/nbs.D110000gmrb_12.htm', method='null', extras={statusCode=200}, priority=0} error
  java.lang.NullPointerException
    at pw.sakalaka.Util.OperationDBData.SaveWebmagicData(OperationDBData.java:27)
    at pw.sakalaka.webmagic.SaveSqlPipeline.process(SaveSqlPipeline.java:52)
    at us.codecraft.webmagic.Spider.processRequest(Spider.java:424)
    at us.codecraft.webmagic.Spider$1.run(Spider.java:322)
    at us.codecraft.webmagic.selector.thread.CountableThreadPool$1.run(CountableThreadPool.java:74)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

错误位置:new OperationDBData().SaveWebmagicData(date, pdfFile, rank, "SaveSqlPipeline.class");

public void SaveWebmagicData(Date date,PdfFile pdfFile,ranking rank,String position){
    pdfFileService.insert(pdfFile);
    rankingService.insert(rank);

//保存日志信息

SaveLoginfo(date, position, "插入数据:"+"pdfFile_id="+pdfFile.getId()+" ranking_id="+rank.getId());

}

望答复

加载中
0
为毛我名叫酱油
为毛我名叫酱油
public class SaveSqlPipeline implements Pipeline {

    public SaveSqlPipeline(Date date, Employer employer,LogInfoService  loginfoService) {
        this.date = date;
        this.employer = employer;
        this.loginfoService=loginfoService;
    }

    private Date date;
    private Employer employer;

    private LogInfoService loginfoService;

//数据插入

LogInfo info=new LogInfo();
        info.setPosition("sdfghj");
        info.setErrinfo("asdfghj");
        System.out.println(info.toString());
        loginfoService.insert(info);


问题在于:在自定义的Pipeline的里面无法自动注入,这可能是webmagin的一个bug。
解决;

  Spider.create(new webmagic_core())
                    //从"https://github.com/code4craft"开始抓
                    .addUrl("http://epaper.gmw.cn/gmrb/html/2015-05/30/nbs.D110000gmrb_01.htm")
                    .addPipeline(new SaveSqlPipeline(date,employer,loginfoService))
                    //开启5个线程抓取
                    .thread(5)
                    //启动爬虫
                    .run();

在这里:new SaveSqlPipeline(date,employer,loginfoService)把service当做参数传入,service在外面完成注入。
在这里谢谢@Pig-man的帮助。

0
Pig-man
Pig-man
OperationDBData(),把这个类贴出来看一下
为毛我名叫酱油
为毛我名叫酱油
数据库保存的方法正常,我测试了一下,数据正常插入
为毛我名叫酱油
为毛我名叫酱油
就是pdffileService.insert(pdffile file)这样的方法,问题是爬取的数据正常,打印输出正常,但是我保存到数据库的时候,就报了一个空指针
为毛我名叫酱油
为毛我名叫酱油
这个类里面是mybaits存储数据方法的集合
0
为毛我名叫酱油
为毛我名叫酱油
不好意思啊[1][1]我在上课:relieved:,类就没法贴了[10][10][10]
Pig-man
Pig-man
回复 @为毛我名叫酱油 : 晚上搞不定再联系我吧
为毛我名叫酱油
为毛我名叫酱油
要不等晚上我上自习的时候吧,今天一天课[10][10],晚上我把代码贴出来,谢谢 你了啊@Pig-man
Pig-man
Pig-man
我感觉你上面把这个类new出来了,这种方式是无法完成注入的,造成空指针
0
为毛我名叫酱油
为毛我名叫酱油
本来直接写的插入数据库的代码,同样报空指针,后来我就移出去了,然后还是报错
0
为毛我名叫酱油
为毛我名叫酱油
方法一:
LogInfo info=new LogInfo();
        info.setPosition("sdfghj");
        info.setErrinfo("asdfghj");
        System.out.println(info.toString());

        sqlSession.getMapper(LogInfoMapper.class).insert(info);

报错。。。

0
为毛我名叫酱油
为毛我名叫酱油
插入数据库测试:  LogInfo info=new LogInfo();
                                     info.setPosition("sdfghj");
                                     info.setErrinfo("asdfghj");

                                     loginfoService.insert(info);

结果:数据插入正常。。

0
为毛我名叫酱油
为毛我名叫酱油

思路:现在怀疑Service无法注入:在外面注入,然后当做参数传入。在调用。


0
为毛我名叫酱油
为毛我名叫酱油
public class OperationDBData {
@Autowired
PdfFileService pdfFileService;
@Autowired
RankingService rankingService;
@Autowired
LogInfoService logInfoService;
@Autowired
EmployerService employerService;

public void SaveWebmagicData(Date date,PdfFile pdfFile,ranking rank,String position){
    System.out.println("*****"+pdfFile.toString());
    System.out.println("*****"+rank.toString());
    //pdfFileService.insert(pdfFile);
    //    rankingService.insert(rank);
    SaveLoginfo(date, position, "插入数据:"+"pdfFile_id="+pdfFile.getId()+" ranking_id="+rank.getId());

}

}

返回顶部
顶部