今天在写爬虫时遇到了在工具类中不能注解成功的问题。下面我把我的解决办法共享给大家。需要引入一个工具类。
package com.nieyb.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @author chenhy
*以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.
*/
@Component
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
/**
* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextHolder.applicationContext = applicationContext;
}
/**
* 取得存储在静态变量中的ApplicationContext.
*/
public static ApplicationContext getApplicationContext() {
checkApplicationContext();
return applicationContext;
}
/**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
checkApplicationContext();
return (T) applicationContext.getBean(name);
}
/**
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
checkApplicationContext();
return (T) applicationContext.getBeansOfType(clazz);
}
/**
* 清除applicationContext静态变量.
*/
public static void cleanApplicationContext() {
applicationContext = null;
}
private static void checkApplicationContext() {
if (applicationContext == null) {
throw new IllegalStateException("applicaitonContext未注入,请在springMVC.xml中定义SpringContextHolder");
}
}
}
在启动程序入口的man方法中添加注解
package com.nieyb;
import com.nieyb.dao.ArticleMapper;
import com.nieyb.dao.RuleMapper;
import com.nieyb.model.Article;
import com.nieyb.model.Rule;
import com.nieyb.service.ArticleService;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
* Hello world!
*
*/
@SpringBootApplication(scanBasePackages = {"com.nieyb"})
@RestController
@EnableScheduling
@MapperScan("com.nieyb.dao")
@EnableFeignClients(basePackages = {"com.nieyb.api"})
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
SpringApplication.run(App.class,args);
}
}
然后在工具类顶部添加
@Component注解。用
ArticleService articleService = SpringContextHolder.getBean("ArticleServiceImpl");来引入注解但是要在你要引入的service的实现类里面添加
@Service("ArticleServiceImpl")注解。参数一定要一致。
我完整的工具类是这样的:
package com.nieyb.gecco;
import com.alibaba.fastjson.JSONObject;
import com.geccocrawler.gecco.annotation.PipelineName;
import com.geccocrawler.gecco.pipeline.JsonPipeline;
import com.geccocrawler.gecco.request.HttpGetRequest;
import com.geccocrawler.gecco.request.HttpRequest;
import com.nieyb.model.Article;
import com.nieyb.model.ArticleDTO;
import com.nieyb.model.Dictionary;
import com.nieyb.service.ArticleService;
import com.nieyb.service.DictionaryService;
import com.nieyb.utils.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@PipelineName(value = "newsContentPipelines")
public class NewsCountentPopeline extends JsonPipeline {
@Override
public void process(JSONObject newsContent) {
HttpRequest currRequest = HttpGetRequest.fromJson(newsContent.getJSONObject("request"));
String title = newsContent.getString("title");
String form = newsContent.getString("form");
String news = newsContent.getString("news");
if (title != "" && title != null && form != "" && form != null && news != "" && news != null) {
System.out.println(title+"*****"+form);
ArticleDTO articleDTO = new ArticleDTO();
Article article = new Article();
article.setContent(news);
article.setForm(form);
article.setTitle(title);
articleDTO.setContentBody(news);
articleDTO.setArticleOrigin(form);
articleDTO.setArticleTitle(title);
articleDTO.setContentTitle(title);
articleDTO.setArticleStatus(1);
//System.out.println(article);
save(article,articleDTO);
}
}
/***
* 将文章入库
* */
public void save(Article article,ArticleDTO articleDTO){
ArticleService articleService = SpringContextHolder.getBean("ArticleServiceImpl");
DictionaryService dictionaryService = SpringContextHolder.getBean("DictionaryService");
Dictionary dictionary = dictionaryService.selectById(1);
String culmn =dictionary.getValue();
articleDTO.setChannelId(culmn);
article.setClumnId(culmn);
//articleService.saveCMS(articleDTO);//保存的CMS库
//articleService.saveCache(article);//保存到中间缓存库中
articleService.addArticle(article);//保存到本地库
}
}