bug记录

问题记录

kefka-eagle-web UI页面显示问题

  • 解决;
    修改C:\Windows\System32\drivers\etc路径下的hosts文件 添加 如下映射:
127.0.0.1  localhost

kafka本机启动没问题 项目启动出现问题

  • 问题描述:
13:43:38.446 [main] ERROR o.s.k.c.KafkaAdmin - [initialize,177] - Could not configure topics
org.springframework.kafka.KafkaException: Timed out waiting to get existing topics; nested exception is java.util.concurrent.TimeoutException
	at org.springframework.kafka.core.KafkaAdmin.lambda$checkPartitions$2(KafkaAdmin.java:238)
	at java.util.HashMap.forEach(HashMap.java:1288)......
  • 分析:
    kafka配置的地址,与本机网络不在同一局域网下 导致kafka服务连接不上
  • 解决:
  1. 打开或者切换到同一网络下,
  2. 修改配置文件kafka的地址为本机地址(本机已安装kafka)

spring boot 启动找不到或无法加载主类问题

  • 分析:
    项目编译的.class文件丢失, 或者缺少对应jar包
  • 解决:
  1. maven配置文件是否添加仓库映射(如阿里云),若未添加,则在标签中添加:
<mirror>
		<id>aliyunmavenid>
		<mirrorOf>*mirrorOf>
		<name>阿里云公共仓库name>
		<url>https://maven.aliyun.com/repository/publicurl>
mirror>
  1. 添加后重新maven, 然后通过 mvn clean compile 命令将项目重新编译 然后通过 mvn install 安装jar包 或者直接通过 mvn clean install 进行编译安装

IDEA 启动项目jdk版本不一致问题

  • 查看项目pom文件中jdk指定的版本
  • 修改项目project Structure中的jdk版本

idea maven 构建不起来

  • 分析:
  1. maven构建时 会从远程仓库读取依赖包的信息,来跟本地进行验证, 若本地仓库中存在 xxx.repositories 或 xxx.lastUpdated 之类的文件则表示本地jar包是不完整的.所以依赖引入不了,项目构建不起来;
  2. maven中jar包下载失败,缺少对应的jar包
  • 解决:
  1. 将 Maven 本地仓库里,找同事拷过来的那个依赖包目录中,将xxx.repositories文件删掉,再重新构建。
  2. 手动下载缺少的jar包 , 然后通过下面命令安装jar包, 完成后刷新
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.1.0 -Dpackaging=jar -Dfile=C:\Users\lym\Desktop\work\ojdbc14-10.2.0.1.0.ja
  1. copy项目能起来的人的maven仓库到本机 , 复制maven配置setting文件, 指定仓库地址为copy的这个, idea 引用修改后的setting文件, 重新构建项目

启动Kafka报错:ERROR Shutdown broker because all log dirs in…

  • 解决:
    删除kafka目录中的kafka-logs文件,同时删除zookeeper配置的dataDir目录内容,再重启zookeeper和kafka服务

问题: websocket使用@Autowired、@Value获取值为null

  • 示例:
@Component
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocketServer {
@Value("${url}")
private String url;
}
  • 原因分析

  • @ServerEndpoint 表示这是一个websocket 服务端类,根本原因在于:spring 管理的都是单例(singleton)和 websocket (多对象)相冲突。

  • websocket多用于客户端与服务端快速通信:聊天、实时输出日志等场景,这意味着**每一个客户端请求服务端都会生成一个新的websocket实例,**spring 仅仅针对@component、@controller注解完成单例模式管理任务(注意仅仅这一次、这一个对象赋值了)后续随着客户单端访问 websocket不断进行实例化(这些对象不是由spring管理的,所以启动过程无法给后续的实际处理websocket会话的实例赋值)。不改变方法的话每个 websocket 对象的 注入对象值都是 null。

  • 解决方式

将要注入的对象设为类级别的变量,并通过在方法上使用@Autowired@Value对变量进行初始化,进而使变量不为空:

@Component
@ServerEndpoint(value = "/webSocket")
@Slf4j
public class WebSocketServer {
  //static为关键
  private static String url;

   @Value("${url}")
   public void setScadaUrl(String scadaUrl) {
       this.url= url;
   }
}

问题: Timer定时器中使用@Autowired,@Resource 注入service为null

  • 解决: 手动注入,通过获取上下文对象,然后再对这个对象进行解析,然后取出自己所要的那个对像。

如下工具类:

@Component
public class SpringContextUtil implements ApplicationContextAware {

    /**
     * Spring应用上下文环境
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * @return ApplicationContext
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 获取对象
     *
     * @param beanName
     * @return Object 一个以所给名字注册的bean的实例
     */
    public static Object getBean(String beanName){
        return applicationContext.getBean(beanName);
    }

    /**
     * 获取类型为requiredType的对象
     *
     * @param clz
     * @return
     * @throws BeansException
     */
    public static <T> T getBean(Class<T> clz) throws BeansException {
        @SuppressWarnings("unchecked")
        T result = (T) applicationContext.getBean(clz);
        return result;
    }


    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.getType(name);
    }

    /**
     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
     *
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return applicationContext.getAliases(name);
    }
}

maven install 时乱码问题 :

  • 解决:

    idea设置—>maven---->runer----> VM Options 添加: -DarchetypeCatalog=internal -Dfile.encoding=GBK

报错:org.apache.ibatis.exceptions.PersistenceException

  • 错误描述:
msg: "nested exception is org.apache.ibatis.exceptions.PersistenceException: \r\n### Error querying database.  Cause: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'uUserLogMapper' available\r\n### Cause: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'uUserLogMapper' available"
  • 原因:

mapper.xml 文件中 字符串字段 做不等于判断时 未对值加引号
bug记录_第1张图片

  • 修改:

将上图中 and t.operate_type != 6 修改为 and t.operate_type != ‘6’ 即可

mapper.xml 文件名不能用两个大写字母开头 否侧会报找不到bean异常

feign 踩坑

  • GET 请求方式 参数前面需要加 @RequestParam
  • POST 请求方式 参数前面需要加 @RequestBody 或者 @RequestParam 前者针对参数为对象格式 后者为普通类型格式

JavaBean的属性变量名前两个字母大小写问题

  • 一般情况下。Java的属性变量名都已小写字母开头,如:userName,showMessage等,但也存在着特殊情况,考虑到一些特定的有意思的英文缩略词如(USA,XML等),JavaBean也允许大写字母起头的属性变量名,不过必须满足“变量的前两个字母要么全部大写,要么全部小写”的要求,例如:IWorkeTimeServiceIEventClient等;

  • 也可以通过在属性上增加 @JsonProperty(value = “sDescRiption”) 注解来解决

BladeX框架中集成 websocket 异常

  • 错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverEndpointExporter' defined in class path resource [com/lym/bladewebsocket/config/WebSocketServiceConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available

  • 原因:
    bladex 框架中使用了spring-boot-starter-undertow容器,而undertow容器底层有jar包与webSocket冲突 需要排除这个

  • 解决: 在pom.xml中加入以下配置

<dependency>
   <groupId>org.springbladegroupId>
   <artifactId>blade-core-launchartifactId>
   <exclusions>
      <exclusion>
          <groupId>org.springframework.bootgroupId>
           <artifactId>spring-boot-starter-webartifactId>
      exclusion>
       
      <exclusion>
            <groupId>org.springframework.bootgroupId>
             <artifactId>spring-boot-starter-undertowartifactId>
      exclusion>
   exclusions>
dependency>

或者用下面这个方式:


<dependency>
  <groupId>org.springbladegroupId>
     <artifactId>blade-core-bootartifactId>
     <exclusions>
         
         <exclusion>
             <groupId>org.springframework.bootgroupId>
             <artifactId>spring-boot-starter-undertowartifactId>
         exclusion>
     exclusions>
 dependency>

 <dependency>
     <groupId>org.springbladegroupId>
     <artifactId>blade-core-commonartifactId> 
     <exclusions>
         <exclusion>
             <groupId>org.springbladegroupId>
             <artifactId>blade-core-launchartifactId>
         exclusion>
     exclusions>
dependency>

在bladex中使用websocket后nacos配置出错,Server check fail, please check server 127.0.0.1 ,port 9848 is available , error ={}

  • 分析:

nacos客户端升级为2.x版本后,新增了gRPC的通信方式,新增了两个端口。这两个端口在nacos原先的端口上(默认8848),进行一定偏移量自动生成(9848,9849)。

  • 可以尝试以下方式修复:

  • 1)关闭防火墙;

  • 2) docker 启动的时候加上这句,“-p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true

  • 3) nocas 本地服务想注册到服务器上的时候,需要加一个配置
    discovery.server-addr ; 注册中心的地址
    config.server-addr ,配置中心的地址

  • 本次错误原因:
    在项目依赖中使用了上述的第二种方式排除自带的undertow容器,但是并没有加上面《blade-core-common》的依赖,导致每次项目启动时都默认去寻找本地的nacos服务地址。 但是代码中配置的nacos(是配在blade-core-common包中的)注册地址在另一台机器(ip不是本机)所以出错。

  • 注意:

因为《blade-core-boot》依赖中已经依赖过《blade-core-launch》包了 所以在依赖《blade-core-common》包时需要排除《blade-core-common》中依赖的《blade-core-launch》包避免造成重复依赖。

springboot中的logback-spring.xml与application.properties加载顺序

  • spring boot会默认加载 logback-spring.xml,文件
  • logback.xml会先application.properties文件加载。

A项目与B项目中有相同类名的class,当在C项目中同时引入A,B项目时,会报冲突错误

  • 原因

springboot加载bean时,默认会将类名首字母小写后作为bean的名字,当className1已经映射到A项目中的ClassName类时,再去依赖B项目的ClassName就会冲突,报错:The alias 'TaskMatchResult' is already mapped to the value 'org.springblade.industrytask.entity.Task

  • 解决

  • 方式一:Idea重命名,修改其中一个class的名字(要注意只修改其中一个项目的);

  • 方式二:若需要依赖项目但不需要这些相同类名的class,则可以在pom文件引入依赖时使用下面方式进行排除;

     <exclusions>  
            <exclusion>  
                <groupId>冲突的包名1groupId>  
                <artifactId>冲突的包名1artifactId>  
            exclusion>  
            <exclusion>  
                <groupId>冲突的包名2groupId>  
                <artifactId>冲突的包名2artifactId>  
            exclusion>  
              
        exclusions>  
    
  • 方式三:若相同名字的class中属性也相同,或其中一个包含另一个的全部属性时,可以使用其中一个,而不再依赖另一个项目(前提是你只需要这部分,若还需要使用项目中其他class则该方法不可用)。

java中匹配字符串中的Html标签,并去除标签

  • 使用正则表达式方式匹配:
public String removeHtmlTags(String html) {  
    return html.replaceAll("<[^>]*>", "###");  //将匹配到的标签替换为指定字符
}
  • 使用 HTML解析库处理,如Jsoup;

  • 添加依赖

    <dependency>  
        <groupId>org.jsoupgroupId>  
        <artifactId>jsoupartifactId>  
        <version>1.14.3version>    
    dependency>
    
  • 去除标签:

    public String removeHtmlTagsUsingJsoup(String html) {  
        return Jsoup.clean(html, Whitelist.none());  //删除所有的HTML标签,只保留纯文本, Whitelist.none() 表示白名单中的不做处理
    }
    

SQL 使用Count函数统计数据,结果集使用map接收,返在map.get(“key”)时报错:java.math.BigDecimal cannot be cast to java.lang.xxx

  • 原因:sql中使用count函数时,返回的数据为long类型。使用sum函数时,返回的数据为BigDecimal类型。直接操作会报java.lang.classCastException类型转换异常;
  • 解决:
  • 方式一:在sql中使用to_char函数将其转换为String类型;
  • 方式二:在使用时,利用xxxValue方法转换类型;

你可能感兴趣的:(bug记录,bug)