//
lombok
有参构造
@Accessors(chain = true) @Setter@Getter@RequiredArgsConstructor(staticName = “of”) public class Student { @NonNull private String name; private int age; }
Spring中类型转换服务ConversionService 以及 Converter 类型转换器
ConfigurableConversionService
json
//禁用 对象循环引用 避免$ref
JSON.toJSONString(obj,SerializerFeature.DisableCircularReferenceDetect)
VO vo = JSON.parseObject(“…”, VO.class, Feature.DisableCircularReferenceDetect)
//返回单引号包裹的string {‘aa’:‘aa’}
JSON.toJSONString(obj,SerializerFeature.UseSingleQuotes)
//泛型反序列化:
List list = JSON.parseObject(“…”, new TypeReference<List>() {});
//fastjson处理日期
JSON.toJSONStringWithDateFormat(date, “yyyy-MM-dd HH:mm:ss.SSS”)
EasyExcel
https://alibaba-easyexcel.github.io/index.html
https://blog.csdn.net/Chen_1999/article/details/119455582
//多sheet页读取—>匿名内部类式写法
InputStream in = serviceFile.getInputStream();
ExcelReader excelReader = EasyExcel.read(in).build();
HashMap<String, List<Map<Integer,String>>> dataMap = Maps.newHashMap();
Map<Integer,String> headMap = Maps.newHashMap();
List readSheets = excelReader.excelExecutor().sheetList();
for (ReadSheet readSheet : readSheets) {
EasyExcel.read(serviceFile.getInputStream(),new AnalysisEventListener<Map<Integer,String>>() {
private List<Map<Integer,String>> datas = new ArrayList<>();
@Override
public void invoke(Map<Integer,String> o, AnalysisContext analysisContext) {
//每读一行
datas.add(o);
}
@Override
public void invokeHeadMap(Map<Integer,String> map, AnalysisContext context) {
//列名
headMap.putAll(map);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//全部读完的数据处理
dataMap.put(String.valueOf(DeptLevelEnum.getCodeByName(readSheet.getSheetName())), datas);
}
}).sheet(readSheet.getSheetName()).doRead();
}
导出多sheet
protected void exportDataTargetModel(JSONObject result, RtSummaryDto dto, HttpServletRequest request, HttpServletResponse response) throws Exception {
ExcelWriter excelWriter = null;
try {
JSONObject data = result.getJSONObject(“body”).getJSONObject(“data”);
//根据模板生成文件
//文件名
String fileName = “实时概况_目标设置_” + DateFormatUtils.format(new Date(), “yyyy-MM-dd”);
excelWriter = EasyExcel.write(getOutputStream(fileName, request, response)).build();
//列头
List headKeys = new ArrayList<>();
List<List> head = getHead(headKeys);
if (0 != result.getIntValue(STATUS) || data == null || data.size() == 0) {
logger.error("目标设置-模板下载error param:{}", dto);
String sheetName = "目标设置_无数据";
WriteSheet sheet = EasyExcel.writerSheet(sheetName).build();
// 创建一个表格
WriteTable table = new WriteTable();
table.setHead(head);
excelWriter.write(Lists.newArrayList(), sheet, table);
} else {
//根据结果创建多个sheet页
String dataString = JSONObject.toJSONString(data);
Map<String, Map<String, String>> allIdAndName = JSONObject.parseObject(dataString, Map.class);
if (logger.isDebugEnabled()) {
logger.debug("dataString======map:" + dataString);
}
for (Map.Entry<String, Map<String, String>> entry : allIdAndName.entrySet()) {
String sheetName = DepartLevelEnum.getNameByCode(Integer.parseInt(entry.getKey()));
if (logger.isDebugEnabled()) {
logger.debug("entry.getKey():" + entry.getKey());
logger.debug("sheetName:" + sheetName);
}
WriteSheet sheet = EasyExcel.writerSheet(Integer.valueOf(entry.getKey()), sheetName).build();
// 创建一个表格
WriteTable table = new WriteTable();
table.setHead(head);
List<List<Object>> list = getListObject(entry.getValue(), headKeys);
excelWriter.write(list, sheet, table);
}
}
} catch (IOException e) {
logger.error("下载目标设置模版失败", e);
} finally {
if (excelWriter != null) {
excelWriter.finish();
}
}
}
Java8 list
addAll 报 java.lang.UnsupportedOperationException: null 错误
总之,Arrays.asList 返回的 List 是一个不可变长度的列表,此列表不再具备原 List 的很多特性,因此慎用 Arrays.asList 方法。
解决 List commonArrayList = new ArrayList<>(Arrays.asList(“a”,“b”,“c”));
单元素list
Collections.singletonList( - )
单元素set
Collections.singleton( - )
先判空再遍历
Optional.ofNullable(node)
.map(CatalogueTreeNode::getChild)
.orElse(Collections.emptyList());
/**
- 去重字符串重复
- @param stringList 字符串List
- @return 返回去重字符串
*/
public static List removeStringListDupli(List stringList) {
Set set = new LinkedHashSet<>();
set.addAll(stringList);
stringList.clear();
stringList.addAll(set);
return stringList;
}
/**
* 根据对象属性去重 属性:userId
* @param persons
* @return
*/
public static List removeDupliById(List persons) {
Set personSet = new TreeSet<>((o1, o2) -> o1.getUserId().compareTo(o2.getUserId()));
personSet.addAll(persons);
return new ArrayList<>(personSet);
}
/**
* 根据对象多个属性去重 属性:userId + userName
* @param persons
* @return
*/
public static List<UserInfo> removeDupliByMorePro(List<UserInfo> persons){
List<UserInfo> personList = persons.stream().collect(Collectors
.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> {
// 根据useId和userName进行去重
return o.getUserId() + "," + o.getUsername() +"," + o.getAge();
}))), ArrayList::new));
return personList;
}
/**
* 根据对象单个属性去重 属性:userId
* @param persons
* @return
*/
public static List<UserInfo> removeDupliByUserId(List<UserInfo> persons){
List<UserInfo> unique = persons.stream().collect(Collectors
.collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(UserInfo::getUserId))), ArrayList::new)
);
return unique;
}
/**
* 根据对象单个属性去重 属性:userId
* @param persons
* @return
*/
public static List<UserInfo> removeDupliByUserIdNew(List<UserInfo> persons){
List<UserInfo> personList = new ArrayList<>();
persons.stream().filter(distinctByKey(p -> p.getUserId()))
.forEach(p -> personList.add(p));
return personList;
}
/**
* 根据key去重重复
* @param keyExtractor key执行器
* @param <T> 泛型
* @return
*/
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
maven测试用例相关
org.apache.maven.pluginsmaven-surefire-plugin2.19
会在打包前 maven test
默认会根据junit执行测试用例
跳过测试用例
org.apache.maven.plugins
maven-surefire-plugin
2.19.1
true
在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:
*/Test.java:任何子目录所有命名以Test开头的Java类。
**/*Test.java:任何子目录下所有命名以Test结尾的Java类。
**/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
只要将测试类按上述模式命名,Maven就能自动运行他们,用户也就不再需要定义测试集合(TestSuite)来聚合测试用例(TestCase)。关于模式需要注意的是,以Test结尾的测试类是不会得以自动执行的。
泛化调用
泛化调用 是指不依赖接口API 根据指定接口方法名称和参数找到指定接口
Dubbo例子:
泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 Map 表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。
<dubbo:reference id=“userService” interface=“com.alibaba.dubbo.samples.generic.api.IUserService” generic=“true”/>
// 需要使用的地方,通过强制类型转化为 GenericService 进行调用:
GenericService userService = (GenericService) context.getBean(“userService”);
// primary param and return value
String name = (String) userService.$invoke(“delete”, new String[]{int.class.getName()}, new Object[]{1});
System.out.println(name);
原理无非就是将泛化调用转化为普通调用,关键在于对象的表示和序列化。
首先,Client会通过动态代理创建GenericService的代理类; 然后,会经过一系列过滤链(优先级排序,默认不需要,大的优先级高)
ConsumerExceptionFilter order = -20000 RpcReferenceContextFilter order = -19500 ConsumerGenericFilter order = -18000 ConsumerTracerFilter order = -10000 ConsumerInvoker 这里会进行真正的业务的调用
在泛化调用过滤器(ConsumerGenericFilter)中,会进行下列操作:
★设置序列化工厂类型为普通序列化(序列化反序列化均使用SofaSerializerFactory,值为0),并设置到Request参数中。
★进行调用参数($invoke参数)的修正,变成普通的调用参数(调用方法,调用参数类型,调用参数值)
★设置调用类型
最后,使用SOFABolt协议进行进行网络调用。
String
显示00,01,02 格式数
String.format(“%02d”,2);
记录一下是工作中遇到的问题
贴上错误:
Could not read JSON: Cannot construct instance of java.util.ArrayList$SubList(no Creators, like default construct, exist): no default no-arguments constructor found
原因是读取Redis缓存时,报错异常导致!
原因是缓存中是集合ArrayList中含有SubList,因为SubList不能序列化和反序列化,导致解析失败。
解决办法:
1、若存在使用SubList方法,只需要 重新new 下:
原代码: channelList = channelList.subList(0, 10);
改正后: channelList = new ArrayList<>(channelList.subList(0, 10));
2、若通过 Lists.partition(list, 10)获取的,则需要将subList转为ArrayList
用: Lists.newArrayList(subList)
over!!!
————————————————
版权声明:本文为CSDN博主「hi丶柒陌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39676186/article/details/121958770