2024

2024-01-07

不知道ApiCloud中的com.uzmap.pkg.uzapp.UZApplication对webView做了什么,使用原生webView打开网页总是显示空白一片。

2024-01-08

controller统一异常处理类:org.springframework.web.servlet.HandlerExceptionResolver

2024-01-16

选项目,要选有正向激励的。(正向激励的意思是,做一点,会收获一点回报,再回一点,收获更多,螺旋上升,渐进激励)

2024-03-06

SpringBoot项目中,tomcat启动的,明明架包中有log4j-slf4j-impl-2.17.2.jar这个类和log4j的包,就是没有日志打印。

启动过程中显示:No SLF4J providers were found.

后来通过对比,没日志的是log4j-slf4j-impl-2.17.2.jar版本的,其它项目中,有日志的是log4j-slf4j2-impl-2.20.0.jar版本的,就是

比较新的那个包,替换比较旧的包,后来重启服务器,居然成功了,有日志了。

后来回过头来看日志,才发现自己吃了目光短㳀的亏,原来重点在之后的几句话。。。。

SLF4J(W): No SLF4J providers were found.
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
SLF4J(W): Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J(W): Ignoring binding found at [jar:file:/project/api/user/WEB-INF/lib/log4j-slf4j-impl-2.17.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J(W): See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.

我了个去。

2024-03-08

Springboot controller中返回的json, 修改date默认返回是时间戳

在application.properties中加上

spring.jackson.serialization..write-dates-as-timestamps=true

2024-04-17

一个类找不到方法,明明用的是最新的jar包,还是报这个错误,后来在idea查到,这个类分别在不同的两个包里面,一个包里的那个类确实没有这个方法

tomcat应该是加载了没有那个方法的类,解决办法,把那个没方法的类,从jar包里面删除。

2024-05-22

Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;  【tomcat 9】

这个报错,基本可以判断是包不兼容。

tomcat9 还挺强大的,直接告诉你原因

 按提示把persistence-api-1.0.2.jar删除就好。

- - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - 

 java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.

 咋一看,还以为是tomcat报的错,其实解决办法是在nginx, nginx配置中upstream 后面的名字不能用下划线,对掉下划线就好了。

参考博客: https://www.cnblogs.com/xiangxinhouse/p/12050966.html

2024-07-04

记一次编译的奇葩经历。

我的完整错误打包过程是这样的(后来总结的),最开始是用的4.6.10版本,后来只在主pom.xml里把改成了5.8.28版本,本地正常打包。放到服务器上报错。

主要原因是,本地打包的时候,是两个版本都有4.6.10和5.8.28。 然后到服务器上,只有5.8.28. 然后就报错了。

原因:所以clsss中的CharSequence和String是有区别的。如果你class中编译的方法是调用CharSequene的参数,试图是调用方法中是String的方法,必报错。

如果class中用的是String方法,然后想调用定义中是CharSequence的方法,必报错。

所以,再一次敲响了警钟,1、不要多个版本并存。2、重新打包的重要性。

因为我本地打包,是两个版本并存的,本打打包用的是String的方法名参数,(就是读的hutools-all4.6.10)。然后放到服务器上,服务器上只有hutools5.8.28的包,这个包里面,对应方法的参数是CharSequence

然后就爆发了冲突,说方法不存在。

java.lang.NoSuchMethodError: cn.hutool.core.date.DateUtil.parse(Ljava/lang/String;)Lcn/hutool/core/date/DateTime;

个人觉得吧,负责维护hutools-all的也有一定责任,为什么 要把String参数的方法取消呢,两个并且不好吗?String和CharSequene都作为方法名参数,两个都存在,这样兼容性不是更强了。

2024-08-02

validation-api-1.0.0.GA.jar和jakarta.validation-api-2.0.2.jar不能同时存在

报错日志:

The called method's class, javax.validation.spi.ConfigurationState, is available from the following locations:

    jar:file:/apps/project/api/API_UBP_BOOT/WEB-INF/lib/validation-api-1.0.0.GA.jar!/javax/validation/spi/ConfigurationState.class
    jar:file:/apps/project/api/API_UBP_BOOT/WEB-INF/lib/jakarta.validation-api-2.0.2.jar!/javax/validation/spi/ConfigurationState.class

原因是两个类里面都有javax/validation/spi/ConfigurationState的 spi 定义,冲突

这两个类在Apache Tomcat/8.5.70中启动是正常在,但是在Apache Tomcat/8.5.92启动中报错。真的是奇怪。

解决办法:删除validation-api-1.0.0.GA.jar  (我第一次删除jakarta.validation-api-2.0.2.jar,启动报缺少类。后来选择删除validation-api-1.0.0.GA.jar ,保留jakarta.validation-api-2.0.2.jar就ok了)

记录一下:

Fiddler :  The System proxy was changed.click to reenable Fidder capture

解决方法:最后面的最有效: https://blog.csdn.net/weixin_46114859/article/details/135158052

- - - - -

在AES中加密中,iv不同,可以让加密同一个原文生成的 密文不同 ,但是解的时候,只有同时密码和iv都对应都上,才能解出原文。

2024-08-07

微信H5的限制还挺多的。

1、h5的订购地址必面在安全域名的网页下触发,也就是header中Referer要是安全域名的网页,否则报错:

商家参数格式有误,请联系商家解决

2、h5下单接口/v3/pay/transactions/h5中的payer_client_ip中的ip要和客户端用户的真实ip一致,要不然报错

  由于商家传入的H5交易参数有误,该笔交易暂时无法完成,请联系商家解决。

3、加解密密钥太长。

java.lang.IllegalArgumentException: java.security.InvalidKeyException: Illegal key size
    at com.wechat.pay.java.core.cipher.AbstractAeadCipher.decrypt(AbstractAeadCipher.java:83) ~[wechatpay-java-core-0.2.12.jar:0.2.12]
    at com.wechat.pay.java.core.certificate.CertificateDownloader.decryptCertificate(CertificateDownloader.java:106) ~[wechatpay-java-core-0.2.12.jar:0.2.12]
    at com.wechat.pay.java.core.certificate.CertificateDownloader.download(CertificateDownloader.java:83) ~[wechatpay-java-core-0.2.12.jar:0.2.12]

有三种解决办法:1替换法:去官网下载没有限制(unlimited)的jar包  local_policy.jar 和 US_export_policy.jar 【lib/security】

2修改法:我的是windows下的jre1.8.0_151版本,系统里自带limited和unlimited的两个版本,所以只需要修改配置,找到

Java\jre1.8.0_151\lib\security\java.security

找到#crypto.policy=unlimited去掉前面的#号就可以了。

3升级法:用最新的java版本就什么都不用改了。linux 1.8.0_275的版本是默认支持的。【1.8.0_91也支持】

2024-08-13

记录一次测试环境没有100%模拟线上环境造成的bug

背景: 旧系统某一类redis键值是java序列化的二进制数据,新系统准备用json字符串代替。

然后想到的解决方案是,先用字符串去取,如果开头是 { 符号,就用json去解析,否则就用java序列化解析。

这样,我们就需要一个RedisTemplate的bean对象

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, byte[]> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, byte[]> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
// 设置key的序列化器为StringRedisSerializer template.setKeySerializer(new StringRedisSerializer());

// 对于byte[]类型的value,不需要设置额外的序列化器 template.afterPropertiesSet(); return template; } }

没毛病,然后创两个设置set和获取get的方法

    @Autowired
    private RedisTemplate<String, byte[]> redisTemplate;

    public byte[] getValueAsBytes(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void setValueAsBytes(String key, byte[] value) {
        redisTemplate.opsForValue().set(key, value);
    }

完美,然后,测试环境因为没有存量的缓存数据,为了保险,我就用setValueAsBytes方法,把一个对象的序列化后的数据设备进去。测试ok, 准备升级。

线上升级报错

java.lang.ClassCastException: com.dr.iptv.vo.UserInitInfo cannot be cast to [B

刚开始报这个错,完全看不懂,我也没要它类型转换呀,我只是要纯byte[]

后来一点点查资料,好像大概意思是,

RedisTemplate默认的ValueSerializer是JdkSerializationRedisSerializer, 然后因为我没有设置,它默认就是JdkSerializationRedisSerializer转换器,

系统无法将UserInitInfo这个类的字节流转成byte[].

然后因为测试环境,我是用setValueAsBytes设置进去的,然后是用getValueAsBytes取出来的,他们是成双成对的,(意思是测试环境应该存的是btye[]对象的序列化字节流)所以没暴露出问题。而正式环境里,redis

里存的是SerializationUtils.serialize(obj)的字节流。 格式不匹配,就报错了。

解决办法:

public class ByteArraySerializer implements RedisSerializer<byte[]> {

    @Nullable
    public byte[] serialize(@Nullable byte[] value) throws SerializationException {
        return value;
    }

    @Nullable
    public byte[] deserialize(@Nullable byte[] bytes) throws SerializationException {
        return bytes;
    }
}
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, byte[]> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, byte[]> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        // 设置key的序列化器为StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());


        template.setValueSerializer(new ByteArraySerializer());
        template.setHashKeySerializer(new ByteArraySerializer());
        template.setHashValueSerializer(new ByteArraySerializer());

        // 对于byte[]类型的value,不需要设置额外的序列化器

        template.afterPropertiesSet();
        return template;
    }
}

2024-08-19

virtual box 手动扩容: VBoxManage modifyhd [虚拟机vdi文件路径] --resize [新大小(MB)]

 VBoxManage modifyhd "C:\Path\To\Your\VirtualBox\VMs\MyVirtualMachine\MyVirtualMachine.vdi" --resize 102400

2024-09-03

com.aliyuncs.exceptions.ClientException: SDK.InvalidRegionId : Can not find endpoint to access.

升级boot的时候jar版本搞错了。之前ok的是aliyun-java-sdk-core-4.5.2.jar版本。

后来升级了一个aliyun-java-sdk-core-4.0.6.jar就报这个错误了。恢复之前的版本就行了。

2024-10-27

如果pom.xml中填的依赖项没指定版本,它就默认下最新版本的。囧。

2024-10-28

以前的系统(spring+hibernate),查数据List<Map<String, Object>>中日期返回的是Timestamp类型。

现在的系统(springboot+mybatis), 查数据List<Map<String, Object>>中日期返回的是LocalDateTime类型。

Timestamp用JSONObject序列化是时间戳,LocalDateTime用JSONObject串列化是字符串 “2021-05-14 00:00:00”   格式不同。。。。

2024-10-29

明明代码是一样的,公司能运行,家里不能运行。

后来发现家里的pom.xml有红线报错。解决办法:

<parent></parent>中加<relativePath/>。取自博客:https://blog.csdn.net/2202_75618418/article/details/128172073   解决办法1.

2024-11-25

nginx中配置了 proxy_set_header Host xx:xx;

然后服务器本身配有302跳转,一跳转之后,原来是域名访问的,变成了xx:xx地址。。。。

2024-12-09

GET请求的一个不安全性是,浏览器会通过Referer携带上一个页面地址,如果你的请求是GET的,那地址和参数都暴露了,如果是POST,至少参数没有暴露。

2024-12-30

Account xxx already exists

以及

remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See http://xxx/help/topics/git/troubleshooting_git#error-on-git-fetch-http-basic-access-denied Authentication failed for 'http://xxx/xx.git/'

是因为idea里面有一个旧的用户名的密码,删除就行了。

File -> Settings... ->  弹出窗口左边搜索GitLab ,删除右边的帐号信息就可以了。

posted on 2024-01-02 15:35  angelshelter  阅读(29)  评论(0编辑  收藏  举报

导航