暂时未有相关云产品技术能力~
业务场景一个类通过一个注解实现预编译(通过 javax.annotation.processing.Processor)比如:Lombok,MapStruct…DDDD~问题描述以前在本项目中(META-INF.services.javax.annotation.processing.Processor)中,因为不能 mvn install 同时编译然后讲加了注解的源文件再经过 Processor 编译,所以每次都只能手动对该源文件进行编译。但是我讲整个项目打成 jar 引到一个 A 项目(无父子模块)中的时,直接可以 mvn install 下来,并且里面也会同时对那个源文件进行 Processor 编译,成功!A 项目 pom 文件<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> </build>现在我将这个 jar 引入到一个 B 项目(属于父子模块并且在子模块中)时,再 mvn install 的时候发现并编译出来的文件并没经过 Processor 编译,失败了唉~问题分析于是对上述 A、B 项目进行 Pom 分析,因为其他基本都一样引包方式也都是本地引入,一开始还怀疑是不是父子项目模块 ${basedir} 的问题,因为该 jar pom 里面有这个配置jar pom 文件<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>process-META</id> <!-- 打包前再将文件拷贝过来 --> <phase>prepare-package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>target/classes</outputDirectory> <resources> <resource> <directory>${basedir}/src/main/resources/</directory> <includes> <include>**/*</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin>此时,就把 A 项目改造成或者说模拟成 B 项目的情景,但是发现仍然是好的,所以先排除这个 ${basedir} 引起的问题。后来再仔细对比后发现有个配置叫(我们的主角来了)<annotationProcessorPaths> 存在于 B 项目的父模块中B 项目 pom 文件<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>8</source> <target>8</target> <encoding>UTF-8</encoding> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </path> </annotationProcessorPaths> </configuration> </plugin>有没发现 <annotationProcessorPaths> 和之前上面提到的 Processor 很像,而且 mapstruct 和 lombok 都参与了,那么我们的 jar 是不是也应该插一jio~解决方案1、去除 <annotationProcessorPaths> 限制<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>8</source> <target>8</target> <encoding>UTF-8</encoding> </configuration> </plugin>2、添加 <annotationProcessorPaths> 配置<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>8</source> <target>8</target> <encoding>UTF-8</encoding> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </path> <!-- 这就是文中提到的 jar --> <path> <groupId>com.chinadaas.platform</groupId> <artifactId>dflow</artifactId> <version>0.1-SNAPSHOT</version> </path> </annotationProcessorPaths> </configuration> </plugin>
问题描述 即使是设置了开机启动,驱动依然无法开机启动,仍然需要手动启动。 问题分析 如果你仔细观察,你会发现你的 G HUB 和别的软件不太一样,怎么说呢,如图所示 是不是看到了一个安全盾牌一样的标志。这个盾牌的图标,指的是其启动需要以管理员身份启动,这也就导致了G HUB不能再开机继续启动。 解决方案 如图所示,右键 Logitech G HUB,找到属性 => 兼容性 => 取消勾选:以管理员身份运行此程序,如果这里是灰色禁止取消勾选,那么我们看右图,先从左图点击【更改所有用户的设置】,再取消勾选右图中的【以管理员身份运行此程序】 最后 需要重启,再重启之前你会发现这个盾牌图标不会消失。重启之后G HUB就可以正常启动。 Ps:此解决方案适合所有因管理员权限不能开机自启动的软件。
默认用户名admin默认密码C:\Users\用户名\.jenkins\secrets\initialAdminPassword用户名:电脑的用户名启动方法cmd 进入 jenkins.war 的所在文件夹,输入命令启动Jenkinsjava -jar jenkins.war如果端口占用,关闭端口代码,默认端口 8080,如果端口不一样,修改下面的 8080 即可!for /f "tokens=5" %%i in ('netstat -ano ^| findstr 8080') do set pid=%%i taskkill -f -pid %pid%最后,新建 .bat 文件后缀双击杀死进程,重新启动即可~
报错信息ERROR org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 500 millisecond(s) at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:70) at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41) at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44) at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42) at org.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:268) at org.springframework.data.redis.connection.lettuce.LettuceListCommands.convertLettuceAccessException(LettuceListCommands.java:490) at org.springframework.data.redis.connection.lettuce.LettuceListCommands.lLen(LettuceListCommands.java:159) at org.springframework.data.redis.connection.DefaultedRedisConnection.lLen(DefaultedRedisConnection.java:465) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) **** Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 500 millisecond(s) at io.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51) at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:114) at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:69) at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80) at com.sun.proxy.$Proxy196.llen(Unknown Source) at org.springframework.data.redis.connection.lettuce.LettuceListCommands.lLen(LettuceListCommands.java:157) ... 134 more原因分析这个情况是我在将SpringBoot从1.X升级到2.X的时候产生的问题,所以大致可以猜到是版本问题。 解决办法设置超时时间(不推荐)redis: port: 6379 jedis: pool: max-active: 50 max-wait: 5000 max-idle: 50 min-idle: 0 timeout: 500 host: 47.100.21.110这种方法无效,解决不了这个问题,我从0改到500还是报错。但是网上绝大多数都是这种方式,实际上我刚更改过来的时候有效过一阵,之后就又不行了。更改依赖(亲测有效)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>在SpringBoot 1.X版本的jar包依赖中,点击进去依赖项如下:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> </dependencies>升级到SpringBoot 2.X版本之后依赖如下:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.2.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.1.4.RELEASE</version> <scope>compile</scope> <exclusions> <exclusion> <artifactId>jcl-over-slf4j</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>5.1.3.RELEASE</version> <scope>compile</scope> </dependency> </dependencies>可以看到变化是从jedis依赖变成了lettuce-core依赖,而上面的报错io.lettuce.core.RedisCommandTimeoutException也是lettuce-core的异常,所以我的解决方式是先将依赖换回jedis:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>如上,配置文件不变,Redis连接成功,不再报错。
2021年4月全国招收程序员456577人。2021年4月全国程序员平均工资14596元,工资中位数12500元,其中96%的人的工资介于2500元到65000元。 城市 排名城市平均工资最低工资中位数最高工资招聘人数百分比1北京1816652501600045000387429.36%2上海17470525016500441657583418.32%3深圳16943525015500450006438915.55%4杭州1612152501500045000243535.88%5南京1416145001250035000217395.25%6广州14018500012500375004372210.56%7苏州1362550001250035000148513.59%8东莞129085000125003250050851.23%9成都1282038061250031666216625.23%10西安1264037501200030000137263.32%11合肥123794929115003000083022.01%12长沙123705000115003750081651.97%13厦门123155000120003000020220.49%14武汉1214245001150030000256226.19%15宁波120504750115003000045561.10%16天津120125000110003359325220.61%17大连117723750105003121264351.55%18福州111594500105002698932430.78%19重庆110464500100002914468041.64%20青岛10571450090003333349041.18%21济南102733780100002402838830.94%22昆明9186375090002118628510.69%23长春909537509000200009560.23%24哈尔滨8855375080001953911550.28%25沈阳8798378680002211829290.71%26郑州8671375083332250055591.34% 南京的程序员收入超过广州了,这太可怕了。千年未有之大变局。 不过,也许数据也会骗人。也许广州有大量的初级程序员,拉低了工资。那么,我们还是以Java程序员来做比较吧。 排名城市平均工资最低工资中位数最高工资招聘人数百分比1北京18792600016000450001811411.08%2上海18027700017500375002991318.29%3深圳17794700016500375002229413.63%4杭州1739070001500045000102046.24%5广州14364600012500300001891811.57%6南京138505250125003000093715.73%7东莞137885250125003000012390.76%8苏州134425250125003500042912.62%9成都124704008125002500075824.64%10宁波123996488125002346318581.14% 如果单独比较Java程序员,还是广州的工资高。总之,两者的工资水平可能是比较接近了。 职能 职能中位数最低工资最高工资软件工程师12500500037500高级软件工程师15000625035000嵌入式软件开发14000525030000系统分析员12500375035000移动开发工程师12500417840000系统架构设计师22500700058333Web前端开发12500500027500C开发工程师15000525035000算法工程师20000700045000网站架构设计师7500375027500Android开发工程师14000600032500.NET开发工程师12000525022500大数据开发工程师15000525045000游戏开发工程师14250500040000Unity3D15000700036750机器学习17500450060000架构师27500934062500Java开发工程师12500525030000脚本开发工程师8500375024500iOS开发工程师13000650032500HTML5开发工程师12500421827216机器视觉工程师12500525035000多媒体开发工程师20000525045516数据分析经理主管12500400045816CSharp开发工程师12500525022916Python开发工程师12500525030000数据分析师9000375030000爬虫开发工程师12500564030000Cocos2d-x开发工程师12500525028899图像处理工程师15000487537500大数据17500700045000图像算法工程师20000697050000数据7000350037500推荐算法工程师25000900058533自然语言处理(NLP)21666380549450数据建模工程师13500450032850ETL13000700023870PHP开发工程师11500500025000CAE18000550026300小程序开发工程师10000375024060图像识别工程师12500375030000ETL开发工程师12500557525000区块链开发20000525047500数据治理工程师12500353036100分布式250001630036200数据采集工程师7000368523260游戏服务端开发工程师17500564045000Unity3d开发工程师13000525045000反作弊算法工程师400003760045600语音识别工程师17500383042600数据仓库工程师14000500037350GIS12500518527500搜索算法工程师25000487052800数据科学家300001790066400Hadoop工程师17500663054150视觉软件工程师15000747030000技术主管15000650071400BI工程师12500525033000全栈工程师17000475035000人工智能12500375047333驱动工程师225001021053583机器人13250666030000GIS工程师11000193029400前端开发11500375035000深度学习工程师20000700053500Go开发工程师15000688030000MES162501250026600游戏客户端开发工程师17250601045000遥感150001061030999Ruby开发工程师16000301045800编译器开发工程师300002496059700SLAM250001284029800信号处理22500960029500DSP212501535050083芯片350002500037200ADAS200002000020000CTO391661550072000生物信息375003750037500
最近在试试使用springboot编写一个demo进行测试,测试过程中发现@DeleteMapping注解有一些问题,现在汇总如下,有大神指点一下~示例1问题:无法获取参数id的值@DeleteMapping(value = "userinfo") public void deleteUserinfo(Integer id) { System.out.println("========= id : " + id); this.dao.delete(id); }在spring-mvc中,经常使用上面的方法获取参数,无论是get还是post方法都可以获取的到,但是在springboot中这种写法得到的id却是null,然后方法就抛出异常,因为delete方法的参数值不能为null;为什么这种方式获取不到参数值呢?示例2问题:无法执行方法,无法获取参数值@DeleteMapping(value = "userinfo3") public void deleteUserinfo3(@RequestParam("id") int id) { System.out.println("========= id : " + id); this.dao.delete(id); }在postman中进行的测试,无论是 form-data还是x-www-form-unlencoded类型,都无法进入方法体,连第一句打印都不执行,直接报400的错误,错误信息如下{ "timestamp": 1505653583069, "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.MissingServletRequestParameterException", "message": "Required int parameter 'id' is not present", "path": "/userinfo/userinfo3" }很不理解,put方法可以通过修改x-www-form-unlencoded方式,然后通过@RequestParam方法获取参数值,但是delee却不行,不知为何?示例3问题:获取不到参数值@DeleteMapping(value = "userinfo4") public void deleteUserinfo4(Userinfo userinfo) { System.out.println(userinfo); this.dao.delete(userinfo); }在post方法中可以使用entity来接受参数,但是delete方法却不行;上面方法虽然可以执行到方法里面,第一行打印也有内容,但是userinfo对象是空的,没有获取到任何参数,不知为何!后台日志如下:{"age":0,"id":0} Hibernate: insert into userinfo (age, cup_size, name) values (?, ?, ?) Hibernate: delete from userinfo where id=?极其匪夷所思,我只是执行了一个delete操作,为什么日志会打印insert into 语句呢?示例4问题 : 无法获取参数值,方法直接进不到方法体中@DeleteMapping(value = "userinfoMap") public void deleteUserinfoMap(@RequestBody Map<String, String> map) { System.out.println(map); }示例5@DeleteMapping(value = "userinfo/{id}") public void deleteUserinfo2(@PathVariable("id") int id) { System.out.println("========= id : " + id); this.dao.delete(id); }上面的5个例子,只有这种情况下,通过restful的方法才能获取deletemapping的参数值,实在是费解。另外的一个问题在示例5中,delete操作竟然不能执行2次,当第二次执行的时候,由于数据已经被删除,导致程序直接抛出异常,错误信息如下{ "timestamp": 1505654465700, "status": 500, "error": "Internal Server Error", "exception": "org.springframework.dao.EmptyResultDataAccessException", "message": "No class com.zzg.springboot.firstbootweb.entity.Userinfo entity with id 2 exists!", "path": "/userinfo/userinfo/2" }总而言之就是@DeleteMapping注解无法对 form 参数进行参数解析的问题,但是面对 @RequestBody 无法进行参数分解问题。当然下面是我自己写的参数解析注解 @RequestJson(基于Spring)。参考链接:SpringMVC - @RequestJson之HandlerMethodArgumentResolver 从入门到青铜
Redis模糊匹配批量删除操作,使用RedisTemplate操作public void deleteByPrex(String prex) { Set<String> keys = redisTemplate.keys(prex); if (CollectionUtils.isNotEmpty(keys)) { redisTemplate.delete(keys); } }prex 为迷糊匹配的 key,如cache:user:*这里需要判断keys是否存在,如果一个都匹配不到会报错ERR wrong number of arguments for 'del' command当然,如果要直接在linux里面操作的话,在命令行执行以下命令redis-cli keys "keys" | xargs redis-cli delkeys 是要匹配的规则,和上面的prex一样。最后,查询也类似上面代码,借助于 keys 函数,但是一般这种作为工具类使用,不推荐业务上使用,因为效率很低。
获取LinkedHashMap中的头部元素(最早添加的元素):时间复杂度O(1)public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) { return map.entrySet().iterator().next(); }获取LinkedHashMap中的末尾元素(最近添加的元素):时间复杂度O(n)public <K, V> Entry<K, V> getTail(LinkedHashMap<K, V> map) { Iterator<Entry<K, V>> iterator = map.entrySet().iterator(); Entry<K, V> tail = null; while (iterator.hasNext()) { tail = iterator.next(); } return tail; }通过反射获取LinkedHashMap中的末尾元素:时间复杂度O(1),访问tail属性public <K, V> Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map) throws NoSuchFieldException, IllegalAccessException { Field tail = map.getClass().getDeclaredField("tail"); tail.setAccessible(true); return (Entry<K, V>) tail.get(map); }测试代码import static org.junit.Assert.assertEquals; import java.lang.reflect.Field; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map.Entry; import org.junit.Before; import org.junit.Test; public class TestLinkedHashMap { private LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); private String letters[] = { "a", "b", "c", "d", "e" }; @Before public void init() { for (int i = 0; i < letters.length; i++) { map.put(letters[i], i + 1); } } @Test public void testGetHead() { assertEquals(getHead(map).getKey(), "a"); assertEquals(getHead(map).getValue(), Integer.valueOf(1)); } @Test public void testGetTail() { assertEquals(getTail(map).getKey(), "e"); assertEquals(getTail(map).getValue(), Integer.valueOf(5)); } @Test public void testGetTailByReflection() throws NoSuchFieldException, IllegalAccessException { assertEquals(getTailByReflection(map).getKey(), "e"); assertEquals(getTailByReflection(map).getValue(), Integer.valueOf(5)); } public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) { return map.entrySet().iterator().next(); } public <K, V> Entry<K, V> getTail(LinkedHashMap<K, V> map) { Iterator<Entry<K, V>> iterator = map.entrySet().iterator(); Entry<K, V> tail = null; while (iterator.hasNext()) { tail = iterator.next(); } return tail; } @SuppressWarnings("unchecked") public <K, V> Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map) throws NoSuchFieldException, IllegalAccessException { Field tail = map.getClass().getDeclaredField("tail"); tail.setAccessible(true); return (Entry<K, V>) tail.get(map); } }
本文以批量插入配置为例,其他半斤八两~Spring boot+mybatis plus环境,单条插入用的是BaseMapper自带的insert方法public ApiResult addAnc(Anc anc) { ApiResult result = new ApiResult(); Integer insert = ancMapper.insert(anc); if (insert < 1) { return result.failed("发布失败,请联系管理员"); } return result.success(anc); }BaseMapper未提供批量插入接口,但是在com.baomidou.mybatisplus.service.IService中提供了/** * 插入(批量),该方法不适合 Oracle * * @param entityList 实体对象列表 * @return boolean */ boolean insertBatch(List<T> entityList); /** * 插入(批量) * * @param entityList 实体对象列表 * @param batchSize 插入批次数量 * @return boolean */ boolean insertBatch(List<T> entityList, int batchSize);使用方法,定义一个自己的接口,继承IService,泛型为被操作实体类public interface WorkIService extends IService<CmpWork> { } 其中WorkMapper为正常操作的mapper,在业务中测试批量插入操作List<CmpWork> entityList = new ArrayList<>(1000); for (int i=1;i<10000;i++){ CmpWork work = new CmpWork(); work.setWorkName("workNametestBatch"+i); work.setWorkID("testBatch"+i); work.setCreTm(DateUtil.dateToYMDHMS(new Date())); entityList.add(work); } boolean b = workIService.insertBatch(entityList);和单条插入的执行对比了一下,在1000条数据级别内,差别不大,批量操作的优势可能大数据环境下才能显现吧!
如果要被序列化的对象含有一个date属性或者多个date属性按照相同的格式序列化日期的话,那我们可以使用下面的语句实现。在应用的的Main方法体里配置全局参数JSONObject.DEFFAULT_DATE_FORMAT="yyyy-MM-dd"; //设置日期格式JSONObject.DEFFAULT_DATE_FORMAT="yyyy-MM-dd"; //设置日期格式JSONObject.toJSONString(resultMap, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteDateUseDateFormat);但是上面的解决方案面临一个问题,如果不满足上面的条件(多个date属性,而且需要按照不定的格式序列化这些日期属性),那么我们就需要另辟蹊径,使用fastjson的特性来完成:@JSONField(format="yyyyMMdd") private Date date; @JSONField(format="yyyy-MM-dd HH:mm:ss") private Date date1;如果希望DTO转换输出的是下划线风格(fastjson默认驼峰风格),请使用:@JSONField(name="service_name") private String serviceName;FastJSON全局配置说明SerializerFeature.PrettyFormat:格式化输出SerializerFeature.WriteMapNullValue:是否输出值为null的字段,默认为falseSerializerFeature.DisableCircularReferenceDetect:消除循环引用SerializerFeature.WriteNullStringAsEmpty:将为null的字段值显示为""WriteNullListAsEmpty:List字段如果为null,输出为[],而非nullWriteNullNumberAsZero:数值字段如果为null,输出为0,而非nullWriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非nullSkipTransientField:如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为trueSortField:按字段名称排序后输出。默认为falseWriteDateUseDateFormat:全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);BeanToArray:将对象转为array输出QuoteFieldNames:输出key时是否使用双引号,默认为trueUseSingleQuotes:输出key时使用单引号而不是双引号,默认为false(经测试,这里的key是指所有的输出结果,而非key/value的key,而是key,和value都使用单引号或双引号输出)想要全局配置的话,请在Main方法体中设置(SpringBoot Main方法)// 先执行static代码块,再执行该方法 // 是否输出值为null的字段,默认为false JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask(); // 数值字段如果为null,输出为0,而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullNumberAsZero.getMask(); // List字段如果为null,输出为[],而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullListAsEmpty.getMask(); // 字符类型字段如果为null,输出为 "",而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullStringAsEmpty.getMask()暂时未找到xml方式的配置方法,/(ㄒoㄒ)/~~同时上面红色部分在Dubbo环境下,rpc数据序列化使用fastjson会有坑。传递给下游的Bean对象里,如果类属性是基础数据包装对象,比如Byte,fastson反序列化后会给该字段设置默认值0。但你的本意是该属性应该是null,结果却是0。对于程序开发来说0是有意义的数据,最终导致出现BUG、或者数据被0覆盖更新。切记切记,全局配置慎用!/(ㄒoㄒ)/~~
方案1、创建集合,将请求组合到统一文件夹,配置统一的请求header全局变量(1)点击 Postman 右上角配置图标(2)选择“Gobals”,输入key和value,点击“save”进行保存方案2、通过登录接口获取token后,后续的接口需要带上此token才可访问,需要统一带上请求header信息(1)在登录接口,设置tests信息var jsondata=pm.response.json() var token=jsondata.token pm.environment.set("token",token)(2)在其他接口配置token类型以及使用{{token}}即可,譬如这里在文件夹进行配置
加的群太多后经常会弹出一些消息,我们该如何屏蔽这些群消息呢?有时候屏蔽了群消息还能收到@全体成员的消息我们怎么把这种消息屏蔽掉呢? 方法 / 步骤 打开QQ,在联系人界面选择群。 打开群列表,找到你想屏蔽的群。进入群界面,然后在右上角打开设置。 在设置里面找到屏蔽群消息,这样你就收不到任何消息了。 这样设置后,群主和管理员使用@全体成员是没办法忽略的,我们可以这样来操作。 进入群界面,在右侧群成员列表找到群主和管理员。只有他们能够发布@全体成员消息。 鼠标分别移动到群主和群管理员头像上,然后单击鼠标右键,选择屏蔽此人发言。群主和管理员都要一一屏蔽,这样他们在发@全体成员的时候你就接受不到了。 如果你加的群实在是太多,想一次性屏蔽所有群消息,可以这样操作。依然是选择联系人,然后选择群,这时鼠标移动到“群”上时会出现一个下拉框。 打开下拉框,然后选择所有群消息设置,选择屏蔽所有群消息。这样你就屏蔽了所有的群消息,如果有想要接收消息的找到呢个群,打开消息提示就可以了。 注意事项 屏蔽@全体消息一定要屏蔽群主和管理员发言!
相信最近很多人在使用电脑注册google账号验证手机号码的时候都会遇到“此电话号码无法用于进行验证”的问题。下面小编为大家分享一个简单可行的注册方法。 方法 / 步骤 在电脑官网上注册账号验证手机号码时显示是这样的,“此电话号码无法用于进行验证”。 首先点击进入手机版邮件app,点击添加Gmail账号。(不同手机型号界面会有所不同) 方框里无需填写邮件地址或电话号码,直接点击账号登录下方的“创建账号”链接。 这时候会出现创建账号信息页面,在创建账户页面,填写相应信息。手机号码默认已经选择了中国+86的,然后直接点击继续,之后手机会收到一条验证短信,输入验证信息就可以成功创建google账号了。 Google账号创建成功之后,Google的gmail小组会给你发一封邮件。邮件内容如下: Ps:手机一定要选择中国+86,否则会无法注册成功。
先看 1分钟新手教程 ,每一步都要确保正确。如果再连不上,参考以下常见问题,看能不能自己解决。如不能解决,再与我们联系,联系时不要仅问为什么连不上,natapp怎么用之类无意义的问句。应该尽量把详细信息,尽量将隧道类型,错误信息截图,debug信息,等都发给我们,我们才好判断问题,帮助解决。 这里列举常见错误,以及自助解决办法 "认证错误 请登录 https://natapp.cn 查看相关信息 : errorCode :200 Msg:请创建免费/付费隧道后通过authtoken参数登录" 这是代表没有输入authtoken参数,或者authtoken参数输入错误。 浏览器访问出现:Tunnel ywy9n8.natappfree.cc not found 的错误 这是代表natapp没有连上服务器,检查客户端是否连上,处于 online 状态,且检查域名是否输入错误。做过修改后,要清空浏览器缓存后再次刷新尝试。 连接认证服务器错误 1 秒后重试... 连接认证服务器错误 2 秒后重试... 出现这个错误,代表网络有问题,等几分钟重试,或者检查DNS是否已换成114DNS 或 阿里DNS,config.ini 里面的 http_proxy= 必须留空,访问 http://pubstatic.upyun.com/cdn-stream-test.html 检测问题。 出现红色的 Tunnel Status Reconnecting... 更换阿里DNS,检查是否有其他地方已经运行natapp客户端。如果还不行,命令行 加参数 -log=stdout 或者在config.ini log=stdout 然后查看debug日志。 隧道 http://3du4wy.natappfree.cc 无效 无法连接到127.0.0.1:80 此端口尚未提供Web服务 Powered By natapp.cn 这代表natapp客户端已经连接成功,你本地端口的Web服务(nginx,iis等)没有开启或者端口不正确。比如 Tomat的默认端口是 8080。则需要在隧道配置处,将本地改为8080,保存后重启客户端。 用浏览器打开 http://127.0.0.1 来确认已开启web服务(不输入端口代表80) 如果网页访问,出现 500,404 等等错误,这些就代表natapp隧道穿透完全成功,这些错误都是你本地Web服务返回的信息,检查本地 Web 服务或者程序。 Webpack 出现 Invalid Host header 错误,可将 webpack-dev-server disableHostCheck 设置为 true。或者在 隧道配置 Host Header 处修改。
平时在后台留言中,不少小伙伴都留言咨询关于Windows 7的问题,顺带质疑打工妹对于Windows 7的关怀远远不够,总是介绍一些WIN10相关知识...... 打工妹进行了反思,并决定马上改进,本篇文章我们就来看一看关于Windows 7的最新消息! 那就是 Windows 7 还有一个月不到 就正式退休啦!!! 微软官方早已宣布: 对Windows 7的支持将于2020年1月结束。 准确地说,是2020 年 1 月 14 日之后, Microsoft 将不再为运行 Windows 7 的电脑 提供安全更新或支持。 Windows 7发布于2009年,今年正好是它的十周年纪念。在2012年,Windows 7成为全球市场份额率最高的系统,2019年被Windows 10 超越,同年微软宣布将在2020年停止对Windows 7的支持。 不少小伙伴都觉得Windows 7是最好用的操作系统,尤其是在国内,据统计数据显示,Windows 7系统占据了高达 58.5% 的份额。 停止支持WIN7代表什么? ① 微软全面停止对 Windows 7的支持,也就是将不再提供技术支持、软件更新、安全更新或修复。 ② 如果在支持于 2020 年 1 月 14 日结束后继续使用 Windows 7,电脑仍可正常工作,但可能更容易遭遇安全风险。 ③ 微软温馨提示:为了保证您的使用安全,请尽快升级到Windows 10。 为了让大家升级到Windows 10, 微软爸爸真的很拼了...... 12月11日微软宣布, 将开始全屏显示警告提醒, 该提醒描述了在2020年1月14日终止支持后 继续使用Windows 7 Service Pack 1的风险。 警告提醒将一直出现, 直到你采取某些措施为止 ...... 不过,此警告提醒仅会出现在以下版本的Windows 7 中: Starter Home Basic 家庭基础版 Home Premium 家庭高级版 Professional 专业版 (如果你购买了扩展安全更新ESU,则该通知将不会出现) Ultimate 旗舰版 对于已经加入域的计算机或kiosk模式下的计算机上,则不会显示提醒。 Ps:ESU是微软在2023年1月之前为企业客户提供的付费Windows 7扩展安全更新。 课代表总结 目前唯一能延长Windows 7寿命的方法就是ESU。但原则上微软只会再为付费用户提供额外的3年支持 , 3年后也就是 2023 年即便企业愿意付费微软也不会提供支持。 对普通用户来说想要获得支持到 2023 年是没有办法的,除非能够使用某种方式绕过微软限制继续获得安全更新。
数据量太大导致的渲染缓慢(说跟没说一样)。组件 el-tooltip、属性 show-overflow-tooltip 居然会影响 el-table 渲染性能问题,不信把它去掉试试。
在 Element UI 框架中,el-table-column 属性 show-overflow-tooltip 意思是:当内容过长被隐藏时显示 tooltip(默认值为 false)。但是有时候会出现一些莫名其妙的BUG,比如,和 el-form 配合使用时,鼠标碰上去会显示报错的信息而不是内容的信息,还有一些很奇葩的显示。所以本文给大家带来一个替代方案...解决方案:el-tooltip + filter + ellipsis下面举例一个伪代码(此场景是对el-table可进行编辑单元格),思路看懂了就行,用的也是此框架中的另一个组件——“el-tooltip”。HTML<el-table-column label="自定义名称"> <template slot-scope="scope"> <el-tooltip effect="dark" :content="scope.row.customparamName" :disabled="scope.row.customparamName | ellipsis" placement="top"> <div> <span v-if="scope.row.isRead" class="ellipsis diyname-ellipsis-width">{{ scope.row.customparamName }}</span> <el-form-item v-else :prop="'table.' + scope.$index + '.customparamName'" :rules="rules.customparamName"> <el-input class="edit-input" v-model="scope.row.customparamName" placeholder="输入自定义名称" /> </el-form-item> </div> </el-tooltip> </template> </el-table-column>Ps:注意这里 el-tooltip 子节点里只能有一个节点,多个的话会出BUG。Style.diyname-ellipsis-width { display: inline-block; width: 118px; } .ellipsis { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }JSfilters: { ellipsis (value) { // console.log('ellipsis value:'+ value) let width = getTextWidth(value) // console.log(width) if (width > 110) { return false } return true } }
官方链接:https://element.eleme.cn/#/zh-CN/component/image背景原因:el-image 一旦初始化加载失败的话,后期更新是不会出图片的。解决方案:要么一开始在标签 el-image 里添加 “:lazy='true'”,要么在 “:src” 里添加默认图片地址,避免渲染DOM的时候找不到地址导致报错。
用过Maven的都知道Maven的方便便捷,但由于某些网络原因,访问国外的Maven仓库不便捷,好在阿里云搭建了国内的maven仓库。需要使用的话,要在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror:<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>这样即可使用国内Maven仓库,提高日常开发的效率!
2022年06月