java后端自学错误总结
- 一.MessageSource国际化接口
- 二.项目打包报错
- 三.项目运行报错
- 四.springcloud--正在总结中
- 五.分布式seata-------待总结中
- 六.kafka-------待总结中
- 七.MQ-------待总结中
- 八.xxl-job-------待总结中
- 九.mysql-------待总结中
- 十.集合-------待总结中
- 十一.stream流-------待总结中
- 十二.反射-------待总结中
- 十三.类加载器-------待总结中
- 十四.线程-------待总结中
- 十五.网络编程-------待总结中
- 十六.设计模式-------待总结中
- 十七.linux-------待总结中
- 十八.docker-------待总结中
- 十九.压测-------待总结中
- 二十.系统安全-------待总结中
- 二十一.git-------待总结中
- 二十二.redis-------待总结中
- 二十三.缓存-------待总结中
- 二十四.GC-------待总结中
- 二十五.Yapi-------待总结中
- 二十六.导出excel-------待总结中
- 二十七.导出work-------待总结中
- 二十八.导出pdf-------待总结中
- 二十九.html/excel/work/pdf的相互转换-------待总结中
- 三十.二维码-------待总结中
- 三十一.支付-------待总结中
- 三十二.gpt-------待总结中
- 三十三.语音转文字/语音识别-------待总结中
- 三十四.内容安全-------待总结中
- 三十五.ES-------待总结中
- 三十六.过滤器/拦截器-------待总结中
- 三十七.ThreadLocal-------待总结中
- 三十八.mnio-------待总结中
- 三十九.websocket-------待总结中
- 四十.项目部署-------待总结中
- 四十一.异常处理-------待总结中
- 四十二.Aop-------待总结中
- 四十三.环信-------待总结中
- 四十四.单点登录-------待总结中
一.MessageSource国际化接口
今天第一次使用MessageSource接口,比较意外遇到了一些坑
messageSource是spring中的转换消息接口,提供了国际化信息的能力。MessageSource用于解析
消息,并支持消息的参数化和国际化。 Spring 包含两个内置的MessageSource实
现:ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。
我是用的是idea工具进行开发
- 文件中文乱码情况,需要先设置一下idea的编码格式,一定需要设置,要不然直接再文件里面将乱码改成中文会有问题的,出现的问题现象就是第一张图是我没有设置编码的时候的样子,第二张是我改为中文的样子,我按照第二张图运行了代码导致我获得的值是???,4个文号,所以大大家不要和我一样傻直接改文件,按照第三张图配置一下就改为中文了
2.下面是我的代码展示
2.1书写全局异常处理类
/**
* @program:
* @description: 全局异常拦截处理类
* @author: wsw
* @create: 2023-11-29 10:21
**/
@Log4j2
@ControllerAdvice//控制器增强
public class ExceptionCatch {
/**
* 捕获异常
*/
@ResponseBody
@ExceptionHandler({Exception.class})//异常处理器与上面的注解一起使用,可以拦截指定的异常信息
public ResponseResult exception(Exception exception) {
//获取exception异常的类型
exception.printStackTrace();
//记录日志
log.error("catch exception:{}", exception.getMessage());
//返回通用的异常
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR,exception.getMessage());
}
}
2.2书写spring工具类
@Component
public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
{
/** Spring应用上下文环境 */
private static ConfigurableListableBeanFactory beanFactory;
private static ApplicationContext applicationContext;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
{
SpringUtils.beanFactory = beanFactory;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
SpringUtils.applicationContext = applicationContext;
}
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws org.springframework.beans.BeansException
*
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException
{
return (T) beanFactory.getBean(name);
}
/**
* 获取类型为requiredType的对象
*
* @param clz
* @return
* @throws org.springframework.beans.BeansException
*
*/
public static <T> T getBean(Class<T> clz) throws BeansException
{
T result = (T) beanFactory.getBean(clz);
return result;
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name)
{
return beanFactory.containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
*
* @param name
* @return boolean
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
{
return beanFactory.isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
{
return beanFactory.getType(name);
}
/**
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
*
* @param name
* @return
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
{
return beanFactory.getAliases(name);
}
/**
* 获取aop代理对象
*
* @param invoker
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getAopProxy(T invoker)
{
return (T) AopContext.currentProxy();
}
/**
* 获取当前的环境配置,无配置返回null
*
* @return 当前的环境配置
*/
public static String[] getActiveProfiles()
{
return applicationContext.getEnvironment().getActiveProfiles();
}
/**
* 获取当前的环境配置,当有多个环境配置时,只获取第一个
*
* @return 当前的环境配置
*/
public static String getActiveProfile()
{
final String[] activeProfiles = getActiveProfiles();
return !( activeProfiles==null || (activeProfiles.length == 0))? activeProfiles[0] : null;
}
/**
* 获取配置文件中的值
*
* @param key 配置文件的key
* @return 当前的配置文件的值
*
*/
public static String getRequiredProperty(String key)
{
return applicationContext.getEnvironment().getRequiredProperty(key);
}
}
2.3书写扫描异常拦截处理类配置类
@Configuration
@ComponentScan("****.****.****.****")//上面异常处理类的路径
public class ExceptionConfig {
}
2.4书写扫描spring工具类扫描
/**
* @program:
* @description: 扫描spring工具类包
* @author: wsw
* @create: 2023-11-29 13:19
**/
@Configuration
@ComponentScan("****.****.****.****")//上面spring工具类的路径
public class SpringUtilsConfig {
}
2.5自定义异常基础类
public class BaseException extends RuntimeException {
private static final long serialVersionUID=1L;
/**
* 所属模块
*/
private String module;
/**
* 错误码
*/
private String code;
/**
* 错误码对应的参数
*/
private Object[] args;
/**
* 错误消息
*/
private String defaultMessage;
public BaseException(String module, String code, Object[] args, String defaultMessage)
{
this.module = module;
this.code = code;
this.args = args;
this.defaultMessage = defaultMessage;
}
public BaseException(String module, String code, Object[] args)
{
this(module, code, args, null);
}
public BaseException(String module, String defaultMessage)
{
this(module, null, null, defaultMessage);
}
public BaseException(String code, Object[] args)
{
this(null, code, args, null);
}
public BaseException(String defaultMessage)
{
this(null, null, null, defaultMessage);
}
@Override
public String getMessage()
{
String message = null;
if (!StringUtils.isEmpty(code))
{
message = MessageUtils.message(code, args);
}
if (message == null)
{
message = defaultMessage;
}
return message;
}
public String getModule()
{
return module;
}
public String getCode()
{
return code;
}
public Object[] getArgs()
{
return args;
}
public String getDefaultMessage()
{
return defaultMessage;
}
}
2.6自定义异常继承基础类
public class UserException extends BaseException
{
private static final long serialVersionUID = 1L;
public UserException(String code, Object[] args)
{
super("user", code, args, null);
}
}
2.7获取i18n文件将数据交给pring messageSource
/**
* 获取i18n资源文件
*
* @author wsw
*/
public class MessageUtils
{
/**
* 根据消息键和参数 获取消息 委托给spring messageSource
*
* @param code 消息键
* @param args 参数
* @return 获取国际化翻译值
*/
public static String message(String code, Object... args)
{
MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}
}
2.8配置i18n国际化文件messages.properties
not.null=* 必须填写
user.jcaptcha.error=验证码错误
user.jcaptcha.expire=验证码已失效
user.not.exists=用户不存在/密码错误
2.9配置spring资源信息国际化资源文件路径application.yml
spring:
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
总结
- 配置idea编码
- 如果springUtils工具类调用报错空指针异常,请扫描一下springUtils这个包,也就是上面写的springUtilsConfig类,否则 beanFactory会一直是空值
二.项目打包报错
1.项目打包报错
javac: �Ҳ����ļ�: E:\xx\xx\xx\docer-xx\src\main\java\xx\xx\xx\xx\xx\xx.java
�÷�: javac <options> <source files>
-help �����г����ܵ�ѡ��
当时遇见了这个报错整个人都懵逼了打包报错了并且乱码
现在过来人的经验
1.排查当前项目路径是不是包括中文,如果是有中文会报错,这个报错可以考虑在(下面都是以idea举例)File->Setting->Build,Execution,Deployment->Build Tools->Maven->Runner
下面的VM Options后面添加上:-DarchetypeCatalog=internal -Dfile.encoding=GBK
后面的排查与上面的编码无关
2.项目打包之后运行报错
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.15</version>
<configuration>
<mainClass>com.xxx.xxx</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
报错了
修改方式:将skip标签里面的内容改成false
原因: skip标签元素通常用于控制插件的某个目标(goal)是否应该被执行.对于spring-boot-maven-plugin来说,元素用于决定是否跳过插件的默认目标(通常是repackage),该目标会将你的应用打包成一个可执行的jar或war文件。
一.当将设置为true时,Spring Boot Maven插件的默认目标(repackage)会被跳过,这意味着Maven不会创建一个包含所有依赖项的可执行jar或war文件。因此,尽管你的项目可能构建成功(即编译、测试等步骤都通过了),但是最终生成的jar或war文件将不是可执行的,因为它不包含Spring Boot所需的额外配置和依赖项。
二.相反,当你将设置为false(或者根本不在配置中指定它,因为默认值就是false)时,Spring Boot Maven插件的repackage目标会被执行。这个目标会:
1.使用Maven的jar或war插件(取决于你的设置)创建一个普通的jar或war文件。
2.解压这个普通的jar或war文件到一个临时目录。
3.将所有依赖项(包括你的应用代码)添加到这个临时目录中。
4.重新打包这个临时目录为一个可执行的jar或war文件,该文件包含一个嵌入式的Web服务器(如果你是一个web应用)和所有必需的依赖项。
这样,当你运行java -jar target/your-artifact-name.jar时,你的Spring Boot应用就可以正确启动了,因为它包含了所有必需的类和依赖项。
三.项目运行报错
四.springcloud–正在总结中
1.循环嵌套异常
今天再写SpringCloud项目的时候书写测试类运行结果报错了报错的最后的信息是
The dependencies of some of the beans in the application context form a cycle:
newsConfigController (field private com.shengkong.article.service.newsConfigService com.shengkong.article.controller.v1.newsConfigController.newsConfigService)
↓
newsConfigServiceImpl (field protected com.baomidou.mybatisplus.core.mapper.BaseMapper com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.baseMapper)
↓
newsConfigMapper defined in file [E:\shengkong\shengkongtoutiao\shengkong_news\shengkong_news-view\target\classes\com\shengkong\article\mapper\NewsConfigMapper.class]
↓
sqlSessionFactory defined in class path resource [com/shengkong/seata/config/DataSourcesProxyConfig.class]
┌─────┐
| dataSourceProxy defined in class path resource [com/shengkong/seata/config/DataSourcesProxyConfig.class]
↑ ↓
| druidDataSource defined in class path resource [com/shengkong/seata/config/DataSourcesProxyConfig.class]
↑ ↓
| org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker
Error creating bean with name 'druidDataSource' defined in class path resource [com/shengkong/seata/config/DataSourcesProxyConfig.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'dataSourceProxy': Requested bean is currently in creation: Is there an unresolvable circular reference?
项目里面我是继承了mybatis-plus
看到这个报错的时候优先排查了一下mapper.xml的文件里面是否出现了类名路径书写错误排查了没有
然后又去查看了启动类注解里面的MapperScan注解对应的mapper文件路径是不是有问题,查看了还是没问题
排查到这里以后我就看了ctrl+alt+shift+u 查看了对应的关系发现还是没有什么循环依赖的问题
排查到这里有点崩溃了因为技术水平不够实在找不到哪里出了问题,希望有知道的大佬们可以解答一下---------炸裂炸裂炸裂
最后我是再启动类上加了
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
才让测试类的启动正常的
2.项目起来卡住了怎么办
这个时候可以考虑看看是不是idea的断点导致的可以将断点取消掉再去重启项目,目前遇到这种情况