Java can';在非web应用程序中使用@Autowired时不注入存储库
我想在我的spider应用程序中使用SpringBootJPA,我已经有了maven依赖项、模型、modelRepository和application.properties。在我使用注解@autowired来使用这些存储库之后,它将有一个NullPointerException。我如何在我的蜘蛛中使用它们? 这是我的蜘蛛Java can';在非web应用程序中使用@Autowired时不注入存储库,java,hibernate,jpa,spring-boot,dependency-injection,Java,Hibernate,Jpa,Spring Boot,Dependency Injection,我想在我的spider应用程序中使用SpringBootJPA,我已经有了maven依赖项、模型、modelRepository和application.properties。在我使用注解@autowired来使用这些存储库之后,它将有一个NullPointerException。我如何在我的蜘蛛中使用它们? 这是我的蜘蛛 @Component public class Crawler implements PageProcessor { SimpleDateFormat sdf =
@Component
public class Crawler implements PageProcessor {
SimpleDateFormat sdf = new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " );
@Autowired
ArticleRepository articleRepository;
@Autowired
CategoryRepository categoryRepository;
@Autowired
NewsRepository newsRepository;
@Autowired
SourceRepository sourceRepository;
public static String content;
private Site site = Site.me().setRetryTimes(0).setSleepTime(100000000);
public void process(Page page) {
Pattern pattern = Pattern.compile("artiList\\((.*)\\)");
Matcher matcher = pattern.matcher(page.getRawText());
String json = null;
if (matcher.find()) {
json = matcher.group(1);
}
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode;
try {
rootNode = mapper.readTree(json);
JsonNode mainJson = rootNode.path("BAI6RHDKwangning");
Iterator<JsonNode> iterator = mainJson.elements();
String cur = null;
JsonNode mark = null;
List<Map<String, Object>> list = new ArrayList<>();
while (iterator.hasNext()) {
mark = iterator.next();
cur = mark.toString();
Map<String, Object> map = mapper.readValue(cur, Map.class);
list.add(map);
}
dbService(list);
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
public void dbService(List<Map<String, Object>> list) {
try {
for (Map<String, Object> map : list) {
for (String s : map.keySet()) {
System.out.println(s + "=" + map.get(s));
System.out.println();
}
Article article = new Article();
article.setUrl(map.get("url").toString());
if (categoryRepository == null) {
System.out.println("================================================asdasasdsad");
}
Category category = categoryRepository.findByCategoryName("game");
News news = new News();
Source source = sourceRepository.findBySourceName(map.get("source").toString());
if (source == null) {
source = new Source();
source.setSourceName(map.get("source").toString());
} else {
source.setPublishCount(source.getPublishCount() + 1);
}
news.setDocid(map.get("docid").toString());
news.setCommentCount(Integer.valueOf(map.get("commentCount").toString()));
news.setDigest(map.get("digest").toString());
news.setHasImg(Integer.valueOf(map.get("hasImg").toString()));
news.setImgsrc(map.get("imgsrc").toString());
news.setPriority(Integer.valueOf(map.get("priority").toString()));
news.setPtime(sdf.parse(map.get("ptime").toString()));
news.setTitle(map.get("title").toString());
news.setArticleId(article);
news.setCategoryCode(category);
news.setArticleId(article);
news.setSourceId(source);
articleRepository.save(article);
sourceRepository.save(source);
newsRepository.save(news);
}
} catch (ParseException e) {
System.out.println(e.getMessage() );
e.printStackTrace();
}
}
public Site getSite() {
return site;
}
public void runSpider() {
Spider.create(new Crawler())
.addUrl("http://3g.163.com/touch/reconstruct/article/list/BAI6RHDKwangning/0-1.html")
.thread(5)
.run();
}
}
这是我的项目目录。
这是控制台
10:05:34.602 [pool-1-thread-1] ERROR us.codecraft.webmagic.Spider - process request Request{url='http://3g.163.com/touch/reconstruct/article/list/BAI6RHDKwangning/0-1.html', method='null', extras=null, priority=0, headers={}, cookies={}} error
java.lang.NullPointerException: null
at com.cmh.Crawler.dbService(Crawler.java:90)
at com.cmh.Crawler.process(Crawler.java:70)
at us.codecraft.webmagic.Spider.onDownloadSuccess(Spider.java:414)
at us.codecraft.webmagic.Spider.processRequest(Spider.java:406)
at us.codecraft.webmagic.Spider.access$000(Spider.java:61)
at us.codecraft.webmagic.Spider$1.run(Spider.java:320)
at us.codecraft.webmagic.thread.CountableThreadPool$1.run(CountableThreadPool.java:74)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
10:05:34.603 [main] INFO us.codecraft.webmagic.Spider - Spider 3g.163.com closed! 1 pages downloaded.
如何将bean注入到Spring托管上下文之外的类中
为getApplicationContext创建类
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext(){
return context;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}
在您的spider应用程序中
ArticleRepository articleRepository= ApplicationContextProvider.getApplicationContext().getBean(ArticleRepository.class);
CategoryRepository categoryRepository= ApplicationContextProvider.getApplicationContext().getBean(CategoryRepository.class);
NewsRepository newsRepository= ApplicationContextProvider.getApplicationContext().getBean(NewsRepository.class);
SourceRepository sourceRepository= ApplicationContextProvider.getApplicationContext().getBean(SourceRepository.class);
如何将bean注入到Spring托管上下文之外的类中
为getApplicationContext创建类
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext(){
return context;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}
在您的spider应用程序中
ArticleRepository articleRepository= ApplicationContextProvider.getApplicationContext().getBean(ArticleRepository.class);
CategoryRepository categoryRepository= ApplicationContextProvider.getApplicationContext().getBean(CategoryRepository.class);
NewsRepository newsRepository= ApplicationContextProvider.getApplicationContext().getBean(NewsRepository.class);
SourceRepository sourceRepository= ApplicationContextProvider.getApplicationContext().getBean(SourceRepository.class);
使用
new
创建对象时,该对象将不受Spring管理,因此不会发生自动连线
但是您已经有了一个由Spring在runSpider
方法中管理的爬虫bean,您可以只注入这个bean吗,比如:
Spider.create(this).addUrl("http://3g.163.com/touch/reconstruct/article/list/BAI6RHDKwangning/0-1.html")
.thread(5)
.run();
使用
new
创建对象时,该对象将不受Spring管理,因此不会发生自动连线
但是您已经有了一个由Spring在runSpider
方法中管理的爬虫bean,您可以只注入这个bean吗,比如:
Spider.create(this).addUrl("http://3g.163.com/touch/reconstruct/article/list/BAI6RHDKwangning/0-1.html")
.thread(5)
.run();
但是我的spider应用程序中有@Component,它应该由spring管理。但是我的spider应用程序中有@Component,它应该由spring管理。