关于Spring中工具类调用service报NUll问题解决

博客讲述了在Spring项目开发中,由于在Controller层错误地使用new关键字创建Util类实例导致的问题。详细解释了Spring中调用工具类应使用依赖注入以保持bean的上下文,从而避免Service层出现null错误。通过修正代码,成功解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写项目时,遇到了Util和controller及service相互使用的问题。

其中代码为

controller层调用

 此时在controller已经翻了低级错误,工具类的调用我居然用new()!!!!

上传文件时,后端service报错null,后来查资料

 在spring中调用工具类,需要spring注入使用,如果用new,将会脱离spring,无法获取spring容器实例,也就是service层的东西

改正代码

解决!

 

 

### SpringBoot 测试类中调用方法返回 `null` 的原因及解决方案 在 Spring Boot 中,如果测试类中的方法调用返回 `null`,通常是因为某些配置或注解未正确设置,导致依赖注入失败或者上下文加载不成功。以下是具体的原因分析以及对应的解决方案。 #### 1. 缺少必要的依赖项 如果没有引入 Spring Boot 对单元测试的支持依赖,则可能导致无法正常加载 Spring 容器,从而使得通过 `@Autowired` 注入的对象为 `null`。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ``` 确保项目的 `pom.xml` 文件中有上述依赖声明[^2]。 --- #### 2. 测试类缺少必要注解 为了使 Spring Boot 加载应用上下文并支持依赖注入,测试类需要添加特定的注解: - **`@SpringBootTest`**: 表明这是一个基于 Spring Boot 应用程序的集成测试。 - **`@RunWith(SpringRunner.class)` 或者 `@ExtendWith(SpringExtension.class)` (JUnit 5)**: 配置运行环境以便能够识别 Spring 上下文。 示例代码如下: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class MyServiceTest { @Autowired private MyService myService; @Test public void testMyMethod() { String result = myService.myMethod(); System.out.println(result); } } ``` 注意:对于 JUnit 4 和 JUnit 5,分别使用不同的注解来指定运行器。 --- #### 3. 使用错误的测试框架版本 当项目同时存在多个测试框架时(例如 JUnit 4 和 JUnit 5),可能会误选错误的 `@Test` 注解。这会导致测试执行过程中未能正确加载 Spring 容器,进而引发对象为空的情况。 建议统一采用最新版 JUnit 并确认所使用的 `@Test` 来源于正确的包路径。 --- #### 4. 静态字段或方法未被正确初始化 如果尝试从静态上下文中访问非静态属性或方法,也可能遇到类似的 `null` 错误。这是因为静态成员不会自动参与 Spring 的生命周期管理。 可以通过以下方式解决问题: - 将目标组件标记为单例模式; - 利用 `@PostConstruct` 初始化静态变量。 例如: ```java @Component public class StaticBeanExample { private static MyDependency myDependency; @Autowired public StaticBeanExample(MyDependency dependency) { this.myDependency = dependency; } @PostConstruct public void initStaticFields() { // 可在此处进一步处理静态字段赋值逻辑 } public static void useDependency() { if (myDependency != null) { myDependency.doSomething(); } } } ``` 此处展示了如何利用构造函数注入配合 `@PostConstruct` 实现静态字段的安全初始化[^4]。 --- #### 5. 属性解析失败 (`@Value` 注解失效) 有时即使已经完成基本配置,仍然会发现由 `@Value` 注解绑定的外部配置参数显示为 `null`。这种现象多发生在涉及复杂场景的应用开发阶段。 针对此类情况可参考下面做法调整设计思路: - 设置默认值以防备缺失键名的情形发生; - 如果确实需要用到全局共享资源则考虑封装成独立工具类加以维护。 实例片段展示如下所示[^5]: ```java @Component public class ConfigPropertiesUtil { private static String secret; @Value("${jwt.secret}") public void setSecret(String value){ secret = value; } public static String getJwtSecret(){ return secret; } } ``` 以上措施有助于规避潜在风险点的同时提升整体架构灵活性与扩展能力。 --- ### 总结 综上所述,Spring Boot 单元测试期间出现的方法调用结果为 `null` 主要集中在以下几个方面——缺乏核心依赖、遗漏关键注释标签、选用不当测试引擎类别或是特殊情况下需额外关注静态结构部分及其关联行为特性等问题均有可能成为诱因所在;因此按照前述指导逐一排查即可有效解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值