java后端自学错误总结

java后端自学错误总结

一.MessageSource国际化接口

今天第一次使用MessageSource接口,比较意外遇到了一些坑

messageSource是spring中的转换消息接口,提供了国际化信息的能力。MessageSource用于解析
消息,并支持消息的参数化和国际化。 Spring 包含两个内置的MessageSource实
现:ResourceBundleMessageSource和ReloadableResourceBundleMessageSource。

我是用的是idea工具进行开发

  1. 文件中文乱码情况,需要先设置一下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

总结

  1. 配置idea编码
  2. 如果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.排查
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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的断点导致的可以将断点取消掉再去重启项目,目前遇到这种情况

总结

五.分布式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-------待总结中

总结

四十三.环信-------待总结中

总结

四十四.单点登录-------待总结中

总结

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值