赞
踩
持续更新,记录日常开发异常和学习
1.1.1保留现场
1.1.2探究原因
该sh脚本是在Window的notepad++下编写完成后,上传到Linux服务器上,导致格式不兼容,Window下的文件格式是dos,但是Linux需要的是Unix
1.1.3解决方法
在文件路径下输入,修改文件每行的后缀
# sed 's/要被取代的字串/新的字串'
# -i 修改文件内容
sed -i "s/\r//" 文件名.sh
参考链接
1.2.1保留现场
上下键无法查看history历史记录
1.2.2探究原因
history命令被禁用了
1.2.3解决方法
# 查看历史记录数量 若为0 则被禁用
echo $HISTSIZE
# 修改/etc/profile
vi /etc/profile
# 添加 export HISTIZE=500
# 环境变量生效
source /etc/profile
参考链接
1.3.1保留现场
日志乱码
1.3.2探究原因
原因未知
1.3.3解决方法
加入启动参数-Dfile.encoding=utf-8
1.4.1保留现场
服务器重启
1.4.2探究原因
1.4.3解决方法
chmod +x carry.sh
mv carry.sh /etc/init.d/
chkconfig --add carry.sh
chkconfig carry.sh on
chkconfig --list
其他辅助命令
# 删除系统服务
chkconfig --del carry.sh
#启动服务
service carry.sh start
#停止服务
service carry.sh stop
#重启服务
service carry.sh restart
#服务状态
service carry.sh status
参考链接:
2.1.1保留现场
invalid comparison: cn.hutool.core.date.DateTime and java.lang.String
2.1.2探究原因
mybatis在3.30版本及以上判定时间时,不能将DateTime类型与字符串进行比较
<if test="beginTime != null and beginTime != ''">
begin_time >= #{beginTime}
</if>
<if test="endTime != null and endTime != ''">
AND begin_time <= #{endTime}
</if>
2.1.3解决方法
<if test="beginTime != null">
begin_time >= #{beginTime}
</if>
<if test="endTime != null">
AND begin_time <= #{endTime}
</if>
参考链接
3.1.1保留现场
cannot execute UPDATE in a read-only transaction
3.1.2探究原因
后端分别部署在两台机器,同时启动,导致只读
3.1.3解决方法
# 查看事务是否为只读 若为no则是
show default_transaction_read_only;
# 会话级别 取消只读
set default_transaction_read_only = off;
# 数据库级别 取消只读
alter database carry set default_transaction_read_only = off;
参考链接
3.2.1保留现场
select * from test order by begin_time desc;
3.2.2探究原因
3.2.3解决方法
select * from test order by begin_time desc nulls last;
3.3.1保留现场
一个历史版本表,每新增一个版本就会加一,1.0.0 -> 2.0.0 -> 3.0.0 -> 4.0.0…,我处理版本逻辑:每次新增的时候,就先去数据库查询一下,当前最大版本是多少然后加一。
查询最大版本号:
select max(split_part(version, '.', '1')) from history where name = 'carry';
3.3.2探究原因
因为version是varchar类型的,max比较的时候不是按照数字大小比较的,
已经超过了10个版本了,但是查询最大值的时候仍是9
3.3.3解决方法
将varchar转成numeric类型
select max(split_part(version, '.', '1')::numeric) from history where name = 'carry';
4.1.1保留现场
4.1.2探究原因
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
druid:
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: test
login-password: ENC(sNcYmY2fKFxF196qDJP2t3v7GQdNVQPwiv9+gmqzzfKFOW2/2pE2qOITNAIp9wVi)
依赖版本:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<verison>3.0.5</verison>
</dependency>
Jasypt 3.0以上默认使用PBEWITHHMACSHA512ANDAES_256解密,而我一开始采用的PBEWithMD5AndDES加密,加密与解密不一致导致的报错
4.1.3解决方法
参用PBEWITHHMACSHA512ANDAES_256加密
public static void main(String[] args) { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("BLgrkWo8uJOhzs"); config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); String result = encryptor.encrypt("123456"); System.out.println("加密密文 = " + result); String decrypt = encryptor.decrypt(result); System.out.println("解密密文 = " + decrypt); }
参考链接:
补充:又一次发现这个问题,按照上述方法没解决,经排查,发现与jdk版本有关,我目前使用的是1.8.0_301,按照SunJCE中提供的PBEWITHHMACSHA512ANDAES_256加密和解密没有问题,但是在低版本中SunJCE可能未提供这个算法,然后给的另外一种默认算法,造成解密失败。解决方法:升级JDK版本,注意1.8.0_301中的301小版本也很关键
排查思路:
4.2.1保留现场
UserDO.java
@Data
public class UserDO implements Serializable {
/**
* 用户编号
*/
private Integer id;
public UserDO() {
}
}
Test.java
public class Test { public static void main(String[] args) { // 初始化list List<UserDO> list = new ArrayList<>(); for (int i = 0; i < 8; i++) { UserDO user = new UserDO(); user.setId(i); list.add(user); } // 过滤部分值 List<UserDO> userDOList = list.stream() .filter(item -> item.getId() > 4).collect(Collectors.toList()); // 输出原数组 System.out.println("修改之前:" + list); // 改变 userDOList.forEach(item -> item.setId(item.getId() * 2)); // 输出原数组 System.out.println("修改之后:" + list); } }
4.2.2探究原因
在使用stream流的时,返回的集合是新集合,无论你对返回的集合进行新增或删除对原有集合都没有影响到,但是如果你对返回的集合里面原本的对象进行修改值,那么原集合中的对象的值也会发生变化。DEBUG发现返回的集合里面的对象和原集合中的对象引用的地址值是一样的。类似于浅拷贝
4.2.3解决方法
采用深拷贝
UserDO.java
@Data
public class UserDO implements Serializable, Cloneable {
/**
* 用户编号
*/
private Integer id;
public UserDO() {
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Test.Java
public class Test { public static void main(String[] args) throws CloneNotSupportedException { // 初始化list List<UserDO> list = new ArrayList<>(); for (int i = 0; i < 8; i++) { UserDO user = new UserDO(); user.setId(i); list.add(user); } // 过滤部分值 List<UserDO> userDOList = list.stream() .filter(item -> item.getId() > 4).collect(Collectors.toList()); // 输出原数组 System.out.println("修改之前:" + list); // 改变 for (UserDO userDO : userDOList) { UserDO clone = (UserDO) userDO.clone(); clone.setId(clone.getId() * 2); } // 输出原数组 System.out.println("修改之后:" + list); } }
注:除非不得已,不建议如此使用,会导致堆内存存有两份
参考链接:
4.3.1保留现场
java.lang.NoClassDefFoundError: javax/wsdl/OperationType | java.lang.NoClassDefFoundError: org/apache/commons/discovery/tools/DiscoverSingleton
<!-- axis 1.4 jar start --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-jaxrpc</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-saaj</artifactId> <version>1.4</version> </dependency>
4.3.2探究原因
缺少依赖
java.lang.NoClassDefFoundError: javax/wsdl/OperationType
补充:wsdl4j
java.lang.NoClassDefFoundError:org/apache/commons/discovery/tools/DiscoverSingleton
补充:commons-discovery
java.lang.NoClassDefFoundError:javax/xml/soap/SOAPException
补充:axis-saaj
4.3.3解决方法
pom.xml添加依赖
<!-- axis 1.4 jar start --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-jaxrpc</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.2</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-saaj</artifactId> <version>1.4</version> </dependency> <!-- axis 1.4 jar end -->
参考链接:
4.4.1保留现场
第三方接口调用
4.4.2探究原因
4.4.3解决方法
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpUriRequest; import org.springframework.http.HttpMethod; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import java.net.URI; /** * @author wanglei */ public class HttpComponentsClientRestfulHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { /** * 创建请求 * @param httpMethod the HTTP method * @param uri the URI * @return 请求 */ @Override protected HttpUriRequest createHttpUriRequest(HttpMethod httpMethod, URI uri) { if (httpMethod == HttpMethod.GET) { return new HttpGetRequestWithEntity(uri); } return super.createHttpUriRequest(httpMethod, uri); } /** * 定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据 */ private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase { public HttpGetRequestWithEntity(final URI uri) { super.setURI(uri); } @Override public String getMethod() { return HttpMethod.GET.name(); } } }
使用demo
public class RestTemplateTest {
public static void main(String[] args) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> params = new HttpEntity<>("{\"name\":\"carry\"}", headers);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());
ResponseEntity<String> demandIdResponse = restTemplate.exchange("www.baidu.com", HttpMethod.GET, params, String.class);
}
}
参考链接:
4.5.1保留现场
4.5.2探究原因
4.5.3解决方法
logging:
level:
org.flowable.engine.impl.persistence.entity.*: debug
org.flowable.task.service.impl.persistence.entity.*: debug
参考链接:
4.6.1保留现场
需求:传递待办信息使用XML的方式,其中有个标签是一个URL,用于跳转到待办页的,组装完成之后,对方收到解析失败。
4.6.2探究原因
URL:http://127.0.0.1:9090/bpm?id=15845c76-d887-4114-a8e4-943ccc324829&businessKey=SHNDE000001
这个URL存在 & 在XML属于特殊字符,需要转义,如果不转义,则会解析失败
4.6.3解决方法
修改XML的中URL (& ->&)
http://127.0.0.1:9090/bpm?id=15845c76-d887-4114-a8e4-943ccc324829 &businessKey=SHNDE000001
4.7.1保留现场
4.7.2探究原因
在实体类中,使用了lombok中的Accessors(chain = true),生成的set方法返回类型不再是void,而是实体类本身,复制属性使用的是mapstruct,导致mapstruct找不到set方法,目前猜测mapstruct生成实现类过程中,默认找的返回类型为空的的set方法。
4.7.3解决方法
第一种:
删除Accessors(chain = true)注解
第二种:
增加lombok.config配置文件
config.stopBubbling = true
lombok.tostring.callsuper=CALL
lombok.equalsandhashcode.callsuper=CALL
# 如果设置为false,默认情况下生成的setter将返回void
lombok.accessors.chain=false
4.8.1保留现场
org.postgresql.util.PSQLException: ERROR: function find_in_set(bigint, character varying) does not exist
4.8.2探究原因
之前项目使用的数据库是MySQL,后续项目迁移至PostgreSQL,PostgreSQL不存在find_in_set函数
4.8.3解决方法
原SQL:
select * from sys_dept where find_in_set(#{deptId}, ancestors)
适配SQL:
select * from sys_dept where #{deptId}::text = ANY(string_to_array(ancestors, ','))
4.9.1保留现场
根据漏洞报告升级相应的jar,因为commons-compress是间接引用,其对应的上级是poi-ooxml,直接将poi-ooxml从4.1.2升级到了5.2.4,导致的异常如下
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream.builder()Lorg/apache/commons/io/output/UnsynchronizedByteArrayOutputStream$Builder;
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)
4.9.2探究原因
只升级了poi,而没有升级commons-io,升级后的poi使用了新的方法,而新的方法必须是升级commons-io才行
4.9.3解决方法
从2.11.0升级到2.12.0
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.12.0</version>
</dependency>
4.10.1保留现场
项目要转移数据库,因为之前产生的数据量很大了,我就只导出数据定义DDL,并没有任何的数据DML,项目使用了flowable,于是就启动报错了
4.10.2探究原因
原因就是因为flowable启动回产生一些基础数据,但是我的空表没数据导致没数据,就启动失败
4.10.3解决方法
删除所有相关的表:act_* flw_*
在配置文件加入
flowable:
database-schema-update: true
他会创建所有相关表和数据,就可以启动成功了
4.11.1保留现场
项目使用flowable启动流程实例,调用到了jackson
4.11.2探究原因
因项目漏洞扫描,需要升级jackson-databind到2.15.3,所以就只升级了jackson-databind,但是其他相关组件并没有升级
4.11.3解决方法
jackson-core 、jackson-annotations 等jackson相关内容升级至同一版本
5.1.1保留现场
select sm.creator from system_menu sm order by sm.creator
5.1.2探究原因
5.1.3解决方法
select sm.creator from system_menu sm order by ISNULL(sm.creator), sm.creator desc;
5.2.1保留现场
5.2.2探究原因
CREATE TABLE `user` (
`id` bigint NOT NULL COMMENT 'ID',
`name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',
`create_id` bigint DEFAULT NULL COMMENT '创建人ID',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_id` bigint DEFAULT NULL COMMENT '更新人ID',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=BLACKHOLE DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户表';
我忽然发现ENGINE=BLACKHOLE
BLACKHOLE 是MySQL数据库中的一种存储引擎,它不会将数据写入磁盘,而是直接丢弃所有写入操作。这种存储引擎适用于对数据完整性要求不高的场景,例如测试环境或者临时数据存储。
5.2.3解决方法
设置成常规引擎
ALTER TABLE `user` ENGINE=InnoDB;
6.1.1保留现场
#sftp静态映射
location ~/sftp/(.*) {
alias /data/sftp/storage/$1;
}
6.1.2探究原因
6.1.3解决方法
#sftp静态映射
location ~/sftp/(.*) {
add_header Content-Disposition 'attachment';
alias /data/sftp/storage/$1;
}
6.2.1保留现场
413 Request Entity Too Large
6.2.2探究原因
nginx对上传文件的大小有限制,默认是1M,当超过大小的时候会报413(too large)错误
6.2.3解决方法
修改nginx目录下conf/nginx.conf,找到http{}段,修改或者添加
http {
client_max_body_size 100M;
}
参考链接:
7.1.1保留现场
7.1.2探究原因
7.1.3解决方法
参考链接:
7.2.1保留现场
npm run build:prod 打包失败
Error
Cannot find module ‘html-webpack-plugin’
7.2.2探究原因
7.2.3解决方法
npm install --registry=https://registry.npm.taobao.org
npm i html-webpack-plugin --save-dev --legacy-peer-deps
npm run build:prod
参考链接:
8.1.1保留现场
8.1.2探究原因
8.1.3解决方法
参考链接:
9.1.1保留现场
Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getValueExtractors()Ljava/util/Set;
at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:144)
at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:383)
at com.tongweb.tongejb.assembler.classic.ValidatorBuilder$OpenEjbConfig.buildValidatorFactory(ValidatorBuilder.java:399)
at com.tongweb.tongejb.assembler.classic.ValidatorBuilder.buildFactory(ValidatorBuilder.java:109)
at com.tongweb.tongejb.assembler.classic.ValidatorBuilder.buildFactory(ValidatorBuilder.java:65)
at com.tongweb.tongejb.assembler.classic.LazyValidatorFactory.ensureDelegate(LazyValidatorFactory.java:53)
at com.tongweb.tongejb.assembler.classic.LazyValidatorFactory.getFactory(LazyValidatorFactory.java:62)
at com.tongweb.tongejb.assembler.classic.Assembler.createApplication(Assembler.java:938)
9.1.2探究原因
由于Tongweb内部validation-api.jar
与要部署的应用的依赖存在冲突导致
9.1.3解决方法
替换Tongweb内部validation-api.jar,替换的jar版本与部署应用中对应的validation-api.jar版本一致,替换路径在TongWeb/lib/validation-api.jar
参考链接
10.1.1保留现场
git pull 报错
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
10.1.2探究原因
10.1.3解决方法
git config pull.rebase false
默认将pull下来的代码与现有改动的代码进行合并
参考链接
1.1.1保留现场
1.1.2探究原因
1.1.3解决方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。