Springboot中SpringUtil的applicationContext一直是null

文章讲述了在SpringBoot应用中,`LoginContextHolder`中的`applicationContext`始终为null的问题,分析了SpringUtil组件未被正确扫描和注入的原因,以及临时解决方案:自定义SpringUtil并成功注入。作者对Hutool的SpringUtil为何未被识别感到困惑。
摘要由CSDN通过智能技术生成

applicationContext一直是null

以下代码一直抛null,然后仔细一查是applicationContext为null.

package com.example.cw_app_back.modular.context.login;



import cn.hutool.extra.spring.SpringUtil;
import com.example.cw_app_back.modular.context.login.service.LoginContext;
import com.example.cw_app_back.modular.context.login.service.impl.LoginContextImpl;
import com.fasterxml.jackson.databind.util.BeanUtil;

/**
 * 当前登录用户信息获取的接口
 *
 */
public class LoginContextHolder {
    public static LoginContext me() {

      return   SpringUtil.getBean(LoginContextImpl.class);
    }

}

SpringUtil 代码如下

package cn.hutool.extra.spring;

import cn.hutool.core.util.ArrayUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * Spring(Spring boot)工具封装,包括:
 *
 * <pre>
 *     1、Spring IOC容器中的bean对象获取
 * </pre>
 *
 * @author loolly
 * @since 5.1.0
 */
@Component
public class SpringUtil implements ApplicationContextAware {

	private static ApplicationContext applicationContext;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) {
		SpringUtil.applicationContext = applicationContext;
	}

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

	//通过name获取 Bean.

	/**
	 * 通过name获取 Bean
	 *
	 * @param <T> Bean类型
	 * @param name Bean名称
	 * @return Bean
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		return (T) applicationContext.getBean(name);
	}

	/**
	 * 通过class获取Bean
	 *
	 * @param <T> Bean类型
	 * @param clazz Bean类
	 * @return Bean对象
	 */
	public static <T> T getBean(Class<T> clazz) {
		return applicationContext.getBean(clazz);
	}

	/**
	 * 通过name,以及Clazz返回指定的Bean
	 *
	 * @param <T> bean类型
	 * @param name Bean名称
	 * @param clazz bean类型
	 * @return Bean对象
	 */
	public static <T> T getBean(String name, Class<T> clazz) {
		return applicationContext.getBean(name, clazz);
	}

	/**
	 * 获取指定类型对应的所有Bean,包括子类
	 *
	 * @param <T> Bean类型
	 * @param type 类、接口,null表示获取所有bean
	 * @return 类型对应的bean,key是bean注册的name,value是Bean
	 * @since 5.3.3
	 */
	public static <T> Map<String, T> getBeansOfType(Class<T> type){
		return applicationContext.getBeansOfType(type);
	}

	/**
	 * 获取指定类型对应的Bean名称,包括子类
	 * @param type 类、接口,null表示获取所有bean名称
	 * @return bean名称
	 * @since 5.3.3
	 */
	public static String[] getBeanNamesForType(Class<?> type){
		return applicationContext.getBeanNamesForType(type);
	}

	/**
	 * 获取配置文件配置项的值
	 *
	 * @param key 配置项key
	 * @return 属性值
	 * @since 5.3.3
	 */
	public static String getProperty(String key) {
		return applicationContext.getEnvironment().getProperty(key);
	}

	/**
	 * 获取当前的环境配置,无配置返回null
	 *
	 * @return 当前的环境配置
	 * @since 5.3.3
	 */
	public static String[] getActiveProfiles(){
		return applicationContext.getEnvironment().getActiveProfiles();
	}

	/**
	 * 获取当前的环境配置,当有多个环境配置时,只获取第一个
	 *
	 * @return 当前的环境配置
	 * @since 5.3.3
	 */
	public static String getActiveProfile(){
		final String[] activeProfiles = getActiveProfiles();
		return ArrayUtil.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
	}
}





启动类:

package com.example.cw_app_back;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;

import javax.annotation.PostConstruct;
import java.util.TimeZone;

@SpringBootApplication
@MapperScan(basePackages = "com.example.cw_app_back.**.mapper")
@ServletComponentScan
public class CwAppBackApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(CwAppBackApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }

}

但是debug的时候发现这个SpringUtil一直都没进去过.不知道为什么这个Component一直没扫到,注入不进去.但是看看启动类好像没啥毛病啊.

解决:

自己又在自己的包下面写了一遍一模一样的SpringUtil ,然后调用自己的SpringUtil,自己的SpringUtil会注入成功的,也算是解决了,但是很迷茫为什么读不到hutool的SpringUtil,为什么不认.

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Spring Boot加载应用程序上下文失败。 这可能是由于以下原因之一导致的: 1. 应用程序配置错误:检查应用程序配置文件是否正确,例如application.properties或application.yml文件。 2. 依赖项冲突:检查应用程序的依赖项是否存在冲突,可能需要升级或降级某些依赖项。 3. 缺少必需的依赖项:检查应用程序是否缺少必需的依赖项,例如数据库驱动程序或Spring Boot Starter。 4. 代码错误:检查应用程序代码是否存在错误,例如无法找到或加载类。 您可以查看应用程序的日志文件以获取更多详细信息,以确定导致加载应用程序上下文失败的确切原因。 ### 回答2: 在解决SpringBoot应用程序加载ApplicationContext失败的问题时,需要从以下几个方面进行分析: 1.检查pom文件的依赖项 通常,SpringBoot应用程序依赖于许多其他库和框架,如果依赖项存在问题,则可能导致ApplicationContext加载失败。尝试检查依赖是否正确,版本是否与当前SpringBoot版本兼容。 2.检查配置文件 SpringBoot应用程序需要一个或多个配置文件。如果这些文件存在任何错误,可能会导致ApplicationContext加载失败。尝试检查配置文件,确保文件格式正确,属性名称正确,属性值有效和正确地指定配置文件位置。 3.检查注解 SpringBoot使用注解来完成各种任务。如果注解用得不正确或没有正确使用注解可能会导致ApplicationContext加载失败。尝试检查注解,确保正确使用了@Service、@Component等注解。 4.检查应用程序代码 在应用程序编写不正确的代码可能会导致ApplicationContext加载失败。检查代码,找出是否有任何语法错误或逻辑错误。 5.检查日志文件 日志文件可以提供有关ApplicationContext加载失败的更多信息。尝试检查日志文件以查找有关加载失败的详细信息。 在解决ApplicationContext加载失败的问题时,需要进行深入的分析和排查。通过综合上述几个方面进行分析,可以帮助我们找到问题的根源并解决这一问题。 ### 回答3: 当我们在使用SpringBoot进行开发时,可能会遇到“failed to load applicationcontext”这样的错误信息。这个错误信息通常出现在应用程序上下文加载的时候,比如说,当我们在启动SpringBoot应用时,它会自动扫描类路径下的所有组件并将它们加载到应用程序上下文,但是在加载的过程,可能会出现一些问题而导致上下文加载失败。 以下是一些常见的出现“failed to load applicationcontext”错误的原因: 1. 依赖冲突。如果你在应用程序使用了一些不兼容的依赖库,或者使用了多个版本的同一个库,就有可能会导致应用程序上下文加载失败。 2. 配置错误。如果你在应用程序的配置文件有一些错误或者不一致的配置,就有可能会导致应用程序上下文加载失败。 3. 缺少必要的依赖项。如果你在应用程序引用了一个不包含所需依赖项的库,就会导致应用程序上下文加载失败。 解决此问题的方法是: 1. 排查依赖库的错误:我们可以使用一些工具,比如 Maven Dependency Plugin,来排查依赖库的问题。你可以使用该插件查找依赖树的不兼容版本的库,以便找到并解决问题。 2. 检查配置文件:如果你的应用程序的配置文件(比如application.properties或application.yml)出现了问题,就会导致应用程序上下文加载失败。因此,我们可以检查配置文件,找出错误并纠正。 3. 确保所有依赖项都存在:当我们引用某个库时,一定要确保它包含了所有所需的依赖项。如果有任何缺失,就会导致应用程序上下文加载失败。 总之,当我们遇到“failed to load applicationcontext”的错误时,最好先去检查以上三个方面的问题,以确定问题的来源,并解决它们,以便确保应用程序正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值