问题记录
kefka-eagle-web UI页面显示问题
- 解决;
修改C:\Windows\System32\drivers\etc路径下的hosts文件 添加 如下映射:
txt127.0.0.1 localhost
kafka本机启动没问题 项目启动出现问题
- 问题描述:
cmd13: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服务连接不上- 解决:
- 打开vpn或者切换到同一网络下,
- 修改配置文件kafka的地址为本机地址(本机已安装kafka)
spring boot 启动找不到或无法加载主类问题
- 分析:
项目编译的.class文件丢失, 或者缺少对应jar包- 解决:
- maven配置文件是否添加仓库映射(如阿里云),若未添加,则在 <mirrors></mirrors>标签中添加:
xml<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
- 添加后重新maven, 然后通过 mvn clean compile 命令将项目重新编译 然后通过 mvn install 安装jar包 或者直接通过 mvn clean install 进行编译安装
IDEA 启动项目jdk版本不一致问题
- 查看项目
pom
文件中jdk
指定的版本- 修改项目
project Structure
中的jdk版本
idea maven 构建不起来
- 分析:
- maven构建时 会从远程仓库读取依赖包的信息,来跟本地进行验证, 若本地仓库中存在 xxx.repositories 或 xxx.lastUpdated 之类的文件则表示本地jar包是不完整的.所以依赖引入不了,项目构建不起来;
- maven中jar包下载失败,缺少对应的jar包
- 解决:
- 将 Maven 本地仓库里,找同事拷过来的那个依赖包目录中,将xxx.repositories文件删掉,再重新构建。
- 手动下载缺少的jar包 , 然后通过下面命令安装jar包, 完成后刷新
cmdmvn 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
- 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
- 示例:
java@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
对变量进行初始化,进而使变量不为空:
java@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
- 解决: 手动注入,通过获取上下文对象,然后再对这个对象进行解析,然后取出自己所要的那个对像。
如下工具类:
java@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
- 错误描述:
javamsg: "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
文件中 字符串字段 做不等于判断时 未对值加引号
- 修改:
将上图中 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也允许大写字母起头的属性变量名,不过必须满足"变量的前两个字母要么全部大写,要么全部小写 "的要求,例如:
IWorkeTimeService
、IEventClient
等;也可以通过在属性上增加 @JsonProperty(value = "sDescRiption") 注解来解决;
BladeX框架中集成 websocket 异常
- 错误:
javaorg.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中加入以下配置
xml<dependency> <groupId>org.springblade</groupId> <artifactId>blade-core-launch</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </exclusion> <!--核心是这个 去除框架自带的starter-undertow --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </exclusion> </exclusions> </dependency>
或者用下面这个方式:
xml<!--Blade boot--> <dependency> <groupId>org.springblade</groupId> <artifactId>blade-core-boot</artifactId> <exclusions> <!--去除框架自带的starter-undertow--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </exclusion> </exclusions> </dependency> <!--不加此依赖 本地服务启动正常 但注册到其他ip的nacos会报错--> <dependency> <groupId>org.springblade</groupId> <artifactId>blade-core-common</artifactId> <!--nacos地址的配置 在这个包中--> <exclusions> <exclusion> <groupId>org.springblade</groupId> <artifactId>blade-core-launch</artifactId> </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
文件引入依赖时使用下面方式进行排除;
xml<exclusions> <exclusion> <groupId>冲突的包名1</groupId> <artifactId>冲突的包名1</artifactId> </exclusion> <exclusion> <groupId>冲突的包名2</groupId> <artifactId>冲突的包名2</artifactId> </exclusion> <!-- 添加更多的 <exclusion> 子标签来排除其他冲突的类或包 --> </exclusions>
方式三:若相同名字的
class
中属性也相同,或其中一个包含另一个的全部属性时,可以使用其中一个,而不再依赖另一个项目(前提是你只需要这部分,若还需要使用项目中其他class
则该方法不可用)。
java中匹配字符串中的Html标签,并去除标签
- 使用正则表达式方式匹配:
javapublic String removeHtmlTags(String html) { return html.replaceAll("<[^>]*>", "###"); //将匹配到的标签替换为指定字符 }
使用 HTML解析库处理,如Jsoup;
添加依赖
xml<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.14.3</version> <!-- 请根据你的实际需要选择版本 --> </dependency>
去除标签:
javapublic 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
方法转换类型;