关于Mybaits持久化问题
@黄亿华 你好,想跟你请教个问题:
首先上代码:
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());
}
望答复
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
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());
}
}
思路:现在怀疑Service无法注入:在外面注入,然后当做参数传入。在调用。
插入数据库测试: LogInfo info=new LogInfo();
info.setPosition("sdfghj");
info.setErrinfo("asdfghj");
loginfoService.insert(info);
结果:数据插入正常。。
方法一:
LogInfo info=new LogInfo();
info.setPosition("sdfghj");
info.setErrinfo("asdfghj");
System.out.println(info.toString());
sqlSession.getMapper(LogInfoMapper.class).insert(info);
报错。。。
本来直接写的插入数据库的代码,同样报空指针,后来我就移出去了,然后还是报错
我感觉你上面把这个类new出来了,这种方式是无法完成注入的,造成空指针
要不等晚上我上自习的时候吧,今天一天课[10][10],晚上我把代码贴出来,谢谢 你了啊
@Pig-man
回复
晚上搞不定再联系我吧
不好意思啊[1][1]我在上课:relieved:,类就没法贴了[10][10][10]
这个类里面是mybaits存储数据方法的集合
就是pdffileService.insert(pdffile file)这样的方法,问题是爬取的数据正常,打印输出正常,但是我保存到数据库的时候,就报了一个空指针
数据库保存的方法正常,我测试了一下,数据正常插入
OperationDBData(),把这个类贴出来看一下
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的帮助。