目的
将严选和京东的货物商品详情拉取下来,添加到融e购中去。抽象的说就是拉取数据源,将其转为本地数据,将本地数据和目标数据源匹配,上传数据。
接口
pull()
获取数据transform()
转变数据push()
提交数据
知识点总结
问题1
如何提交post请求,并接收返回的JSON内容?
总结
1 | /** |
问题2
当同一接口类出现了不同实现类应该怎么区分?比如pull()
接口有JD和严选两个实现类
回答
可以使用工厂模式,Spring有个方法可以获取该接口的所有实现类
applicationContext.getBeansOfType
- 定义枚举类
1
2
3public enum DataSourceCode {
YX, RYG,JD
}- 定义需要工厂处理的接口
1
2
3
4
5
6public interface DataPullService {
// 业务方法
void msg();
// 得到枚举的值(必须有)
DataSourceCode getCode();
}- 实现接口,这里有多个实现类,这里举例一个
1
2
3
4
5
6
7
8
9
10
11
12
public class RYGPullServiceImpl implements DataPullService {
public void msg() {
System.out.println("业务逻辑");
}
// 融e购的就返回DataSourceCode.RYG,JD的就返回DataSourceCode.JD
public DataSourceCode getCode() {
return DataSourceCode.RYG;
}
}- 定义工厂类实现ApplicationContextAware
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class DataPullModeFactory implements ApplicationContextAware {
// DataSourceCode 枚举类
// DataPullService 需要工厂的接口
private static Map<DataSourceCode, DataPullService> trafficBeanMap;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, DataPullService> map = applicationContext.getBeansOfType(DataPullService.class);
trafficBeanMap = new HashMap<>();
map.forEach((key, value) -> trafficBeanMap.put(value.getCode(), value));
}
// 根据Controller传来的字段不同匹配之后返回不同的实现类
public static <T extends DataPullService> T getTrafficMode(String code) {
DataSourceCode sqlTypeEnum = null;
// 将String字符串转枚举类型
try {
sqlTypeEnum = DataSourceCode.valueOf(code.toUpperCase());
T t = (T) trafficBeanMap.get(sqlTypeEnum);
return t;
} catch (IllegalArgumentException ex) {
log.error("没有该枚举类型");
}
// 当字符串和枚举类型不匹配返回null
return null;
}
}在引入
@Autowired
注解的前提下再引入@Qualifier("XXX")
其中XXX为接口实现类的注解@Service("XXX")
的字段,或者引入@Resource(name = "XXX")
,原因是@Autowired
是通过 byType,要求接口只能有一个实现类,@Resource
可以通过 byName 和 byType的方式注入
1 | // Service类 |
问题3
需求中获取图片传给我们的是一个css字符串,从字符串中获取图片url,该如何获取?
1 | .ssd-module-wrap .M155981154483112{width:750px; background-size:100% 100%; background-image:url(//img30.360buyimg.com/sku/jfs/t1/73828/1/1315/122974/5cf8d522Eb33a4aa5/ccf3bf9a5a7fcc96.jpg); height:750px} |
回答
我采用的是正则匹配,将所有匹配该正则的字符串提取出来
1 | List<String> strs = new ArrayList<String>(); |
问题4
遇到需要自行截取字符串的需求,该是用什么方法?
回答
我采用的是substring
的方法,但是有时候我们并不知道从哪个固定的索引开始截取,所以还必须使用indexOf
方法,两者结合起来用
1 | /** |
问题5
需求中需要将javaBean转为xml,需要怎么操作?
回答
可以pom引入Jackson,fastJSon不支持javabean和xml的互转
1 | <dependency> |
1 | // 将javaBean转为xml |
在需要转xml的bean中添加注解来进行配置,告诉jackson需要如何转变
1 |
|
问题6
如何将获取的JSON信息快速生成JavaBean?
回答
可以通过该网站生成,将JSON复制到其中,点击生成实体类即可
问题7
需求:接收图片的url,如果图片宽度不符合要求,则改变图片宽度,读取图片二进制内容进行BASE64编码,获取编码后的内容
回答
1 | public class imageUtils { |
问题7
如何将二进制文件进行Base64处理?
回答
java8之后可以采用java.util套件中新增的Base64工具类
1 | final Base64.Decoder decoder = Base64.getDecoder(); |
问题8
需求:从List中每次取n个数据返回
回答
1 | public static Map groupList(List list,int n){ |
问题9
需求:sign需要32位MD5加密
回答
1 | /** |
问题10
需求:时间戳格式要求为yyyy-MM-dd HH:mm:ss,比如2019-09-06 14:08:23
回答
1 | private static SimpleDateFormat defForMat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); |
问题11
如何将转换javaBean、JSONObject、JSONArray?使用fastJson
回答
1 | // 整个JSONObject转javaBean |
问题12
从List中如何获取相同的内容,组成一个新的List
回答
1 | public static List<Attribute> getNewList(List<Attribute> list) { |