admin管理员组

文章数量:1537264

Bug清单

持续更新,记录日常开发异常和学习

1.Linux

1.1 invalid option2: set: -

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

参考链接

  • Linux 系统运行sh文件 invalid option9.sh: line 2: set: -报错

1.2 上下键无法查看history历史记录

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

参考链接

  • Linux环境使用上下方向键无法查看history历史记录问题解决方法

1.3 jar包启动日志乱码

1.3.1保留现场
日志乱码

1.3.2探究原因
原因未知

1.3.3解决方法
加入启动参数-Dfile.encoding=utf-8

1.4 开机自动启动jar包

1.4.1保留现场
服务器重启

1.4.2探究原因

1.4.3解决方法

  1. 编写jar启动脚本(根据自己项目)
  2. 添加执行权限chmod +x carry.sh
  3. 移动mv carry.sh /etc/init.d/
  4. 注册系统服务chkconfig --add carry.sh
  5. 设置开机启动chkconfig carry.sh on
  6. 查看系统服务列表chkconfig --list

其他辅助命令

# 删除系统服务
chkconfig --del carry.sh
#启动服务
service carry.sh start
#停止服务
service carry.sh stop
#重启服务
service carry.sh restart
#服务状态
service carry.sh status

参考链接:

  • 开机自动启动jar包-Linux篇

2.Mybatis

2.1 invalid comparison: cn.hutool.core.date.DateTime and java.lang.String

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 &gt;= #{beginTime}
</if>
<if test="endTime != null and endTime != ''">
    AND begin_time &lt;= #{endTime}
</if>

2.1.3解决方法

<if test="beginTime != null">
    begin_time &gt;= #{beginTime}
</if>
<if test="endTime != null">
    AND begin_time &lt;= #{endTime}
</if>

参考链接

  • 报错:invalid comparison: cn.hutool.core.date.DateTime and java.lang.String

3.Postgresql

3.1 cannot execute UPDATE in a read-only transaction

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;

参考链接

  • pgsql 报错 in a read-only transaction

3.2 指定值排序,空值排序在前

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 max(text)不是数字最大值

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.Java

4.1Failed to bind properties under ‘spring.datasource.druid.stat-view-servlet.login-password’ to java.lang.String

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);
}

参考链接:

  • Spring Boot Jasypt 3.0.4 报错—算法加解密使用不一致

补充:又一次发现这个问题,按照上述方法没解决,经排查,发现与jdk版本有关,我目前使用的是1.8.0_301,按照SunJCE中提供的PBEWITHHMACSHA512ANDAES_256加密和解密没有问题,但是在低版本中SunJCE可能未提供这个算法,然后给的另外一种默认算法,造成解密失败。解决方法:升级JDK版本,注意1.8.0_301中的301小版本也很关键

排查思路:

  1. 在jre1.8.0_301\lib\security\java.security文件中可以看到,提供者和默认加密算法

  2. 查看获取的加密算法是否与你设置的一致

    javax.crypto.SecretKeyFactory#getInstance(java.lang.String, java.lang.String)
    javax.crypto.Cipher#getInstance(java.lang.String, java.lang.String)

4.2改变list.steam.filter返回的list会影响原数组

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);
    }
}


注:除非不得已,不建议如此使用,会导致堆内存存有两份

参考链接:

  • Java8 stream流 生成新的集合,那么新集合里面的值是否为原值呢?

4.3 java.lang.NoClassDefFoundError: javax/wsdl/OperationType | java.lang.NoClassDefFoundError: org/apache/commons/discovery/tools/DiscoverSingleton | java.lang.NoClassDefFoundError:javax/xml/soap/SOAPException

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 -->

参考链接:

  • Axis1.4 依赖的jar包,maven配置
  • java.lang.ClassNotFoundException:org.apachemons.discovery.tools.DiscoverSingleton

4.4 RestTemplate GET请求在Body中传递JSON数据

4.4.1保留现场
第三方接口调用
4.4.2探究原因

4.4.3解决方法

  1. 重写HttpComponentsClientHttpRequestFactory
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", HttpMethod.GET, params, String.class);
    }
 }

参考链接:

  • RestTemplate 支持GET请求在body里面传递json

4.5 控制台打印flowable执行的sql语句

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

参考链接:

  • 学习记录544@springboot配置日志来打印flowable执行的sql语句

4.6 传入的XML参数不合规范

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 (& ->&amp;)
http://127.0.0.1:9090/bpm?id=15845c76-d887-4114-a8e4-943ccc324829 &amp;businessKey=SHNDE000001

4.7Caused by: java.lang.NoSuchMethodError: ***.setName(Ljava/lang/String;)V

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 org.postgresql.util.PSQLException: ERROR: function find_in_set(bigint, character varying) does not exist

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 java.lang.NoSuchMethodError: org.apachemons.io.output.UnsynchronizedByteArrayOutputStream.builder()

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.apachemons.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 Caused by: org.flowablemon.engine.api.FlowableException: Error initialising eventregistry data model

4.10.1保留现场
项目要转移数据库,因为之前产生的数据量很大了,我就只导出数据定义DDL,并没有任何的数据DML,项目使用了flowable,于是就启动报错了

4.10.2探究原因
原因就是因为flowable启动回产生一些基础数据,但是我的空表没数据导致没数据,就启动失败
4.10.3解决方法
删除所有相关的表:act_* flw_*
在配置文件加入

flowable:
  database-schema-update: true

他会创建所有相关表和数据,就可以启动成功了

4.11 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/exc/StreamConstraintsException

4.11.1保留现场
项目使用flowable启动流程实例,调用到了jackson
4.11.2探究原因
因项目漏洞扫描,需要升级jackson-databind到2.15.3,所以就只升级了jackson-databind,但是其他相关组件并没有升级
4.11.3解决方法
jackson-core 、jackson-annotations 等jackson相关内容升级至同一版本

5. Mysql

5.1 指定值排序,空值排序在前

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 消失的数据

5.2.1保留现场

  1. 在代码中使用Mybatis insert怎么也插入不了,日志明明打印了insert语句,但是数据库中适中为空
  2. 然后我就把代码单独拿出来在dbeaver执行,显示插入成功,但是查询还是空
  3. 我就怀疑是不是数据库的问题,于是试了一下其他的表,发现可以成功插入并查询到,所以可以定位到是表的问题
  4. 然后我把表给删除了,并提前复制好DDL,然后重新创建,发现还是那样
  5. 我就怀疑是表的DDL问题

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. Nginx

6.1 设置图片等资源,强制下载

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 413 Request Entity Too Large

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;
}

参考链接:

  • Nginx 413 Request Entity Too Large 错误解决方法

7. Vue

7.1 Vue非开发环境开启vue-devtools

7.1.1保留现场

7.1.2探究原因

7.1.3解决方法

  1. 打开F12,选择源代码/Source,找到当前项目的基础库所在的js文件,一般名称以app开头,使用浏览器格式化工具查看,然后CTRL+F全局搜索config.productionTip
  2. 在new那一行打断点,并F5刷新,拿到vue的配置对象
  3. 在控制台改为true
  4. 取消断点,关闭 F12/开发者调试面板,再次打开 F12 即可看到 vue 菜单已经出来了

参考链接:

  • vue生产环境开启vue-devtools

7.2 Cannot find module ‘html-webpack-plugin’

7.2.1保留现场
npm run build:prod 打包失败
Error
Cannot find module ‘html-webpack-plugin’
7.2.2探究原因

7.2.3解决方法

  1. 删除 node_modules 目录
  2. 重新安装依赖:npm install --registry=https://registry.npm.taobao
  3. 安装缺少的依赖:npm i html-webpack-plugin --save-dev --legacy-peer-deps
  4. 重新打包 npm run build:prod

参考链接:

  • 若依Vue分离版打包报错Cannot find module ‘html-webpack-plugin

7.3 Error: error:0308010C:digital envelope routines::unsupported

7.3.1保留现场
npm run dev启动报错:Error: error:0308010C:digital envelope routines::unsupported

7.3.2探究原因
我将nodejs升级到了20.11.1
node.js 17版本中发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,在node.js 17以前一些可以正常运行的的应用程序,但是在 V17 版本可能会抛出这个异常。

7.3.3解决方法
我是win系统,所修改启动命令:set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve
如果是mac系统,修改启动命令:export NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve

package.json文件

参考链接:

  • Error: error:0308010C:digital envelope routines::unsupported

8. dbeaver

8.1 在无网络的情况下给Dbeaver安装数据库驱动

8.1.1保留现场

8.1.2探究原因

8.1.3解决方法

  1. 在有网络的电脑上,打开dbeaver,数据库->驱动管理器->编辑
  2. 编辑打开之后,点击,若还没下载,先点一下下载/更新按钮,然后点击信息,打开信息窗口,看到文件信息,驱动就下载在你电脑的这个位置,然后可以把maven-central下的对应数据库驱动的文件夹,复制到U盘,传递到没网的机器上
  3. 无网机器上,打开dbeaver,依次点击数据库->驱动管理器->编辑进入到相同界面,点击添加文件夹,将复制过来的驱动文件夹添加进去就可以了

参考链接:

  • 如何在无网络的情况下给Dbeaver安装数据库驱动

9. TongWeb

9.1 Caused by: java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getValueExtractors()Ljava/util/Set

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

参考链接

  • TongWeb常见报错

10. Git

10.1 Need to specify how to reconcile divergent branches.

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下来的代码与现有改动的代码进行合并

参考链接

  • 【Git】pull 分支报错 fatal: Need to specify how to reconcile divergent branches…

10.2 Git 修改已经 COMMIT 的用户名与邮箱

10.2.1保留现场
git仓库增加了代码门禁,需要使用特定的用户名和邮箱

10.2.2探究原因
git仓库增加了代码门禁,需要使用特定的用户名和邮箱

10.2.3解决方法
对于最近一次未push的commit

$ git config user.name "Author Name"
$ git config user.email email@address
$ git commit --amend --reset-author --no-edit

参考链接

  • Git 修改已经 COMMIT 的用户名与邮箱

1.1.1保留现场

1.1.2探究原因

1.1.3解决方法

本文标签: 清单Bug