Servlet @Autowired Spring Bean 的方法 .

本文介绍了解决在使用@Autowired自动装配Bean时遇到的空指针异常问题的方法。提供了两种解决方案:一种是在Servlet的init方法中进行手动装配;另一种是通过SpringBeanAutowiringSupport来实现自动装配。

使用@Autowired自动装配Bean时出现错误,代码如下:

public class GetYJGNQ extends HttpServlet {
	@Autowired
	private IDataForWebService getDataForWebService;
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public void setGetDataForWebService(IDataForWebService getDataForWebService) {
		this.getDataForWebService = getDataForWebService;
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
	    	out.print(getDataForWebService.getYJGNQ());
		out.flush();
		out.close();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doGet(request, response);
	}
}

代码getDataForWebService.getYJGNQ()会java.lang.NullPointerException,因为getDataForWebService 没有装配上,所以是空指针

解决方式如下:

第一种:

Servlet的init方法中增加以下代码,即可通知Servlet在启动时,自动查找getDataForWebService并装配,

public void init(ServletConfig config) throws ServletException {
		ServletContext servletContext = config.getServletContext();
		WebApplicationContext webApplicationContext = WebApplicationContextUtils
				.getWebApplicationContext(servletContext);
		AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext
				.getAutowireCapableBeanFactory();
		autowireCapableBeanFactory.configureBean(this, "getDataForWebService");
	}

这个在配置文件中配置好使,但现在我们使用的自动装配,那就要用第二种。

 

第二种方式:

public void init(ServletConfig config) throws ServletException {
	    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
	    	      config.getServletContext());
	}

原文: 点击打开链接
<think>首先,用户的问题是关于Spring框架的依赖注入问题,具体是:在配置过程中,`DelegatingWebMvcConfiguration`的`setConfigurers`方法提示找不到`StringRedisTemplate`类型的Bean。用户提到参考了站内引用,但那些引用是关于Spring Boot的启动流程、配置属性、日志配置和配置类的,不是直接相关的。 用户的问题核心是:在Spring应用中,当尝试使用`DelegatingWebMvcConfiguration`时,遇到了一个错误,提示找不到`StringRedisTemplate` Bean。我需要帮助用户解决这个问题。 关键点: - `DelegatingWebMvcConfiguration` 是Spring MVC的一部分,用于配置Web MVC。 - `setConfigurers` 方法可能是在尝试注入一些配置器,但需要`StringRedisTemplate` Bean,而它没有被找到。 可能的原因: 1. **缺少依赖**:项目可能没有添加Redis相关的依赖,比如Spring Data Redis。 2. **Bean未定义**:`StringRedisTemplate` Bean 没有被正确配置或定义。 3. **配置问题**:配置类可能没有被扫描到,或者依赖注入设置不正确。 4. **环境问题**:Redis服务可能没有启动,或者配置错误。 参考用户提供的引用: - 引用[1]:关于SpringApplication的初始化,包括设置初始化和监听器。 - 引用[2]:关于WebMvcProperties,用于配置Spring MVC属性。 - 引用[3]:关于日志配置,使用logback-spring.xml。 - 引用[4]:关于@SpringBootConfiguration和@Configuration注解。 这些引用不是直接相关的,但提示用户可能在Spring Boot环境中工作。我应该基于Spring Boot来回答,因为用户提到了Spring框架和Web应用开发。 解决方案步骤: 1. **添加依赖**:确保项目中包含了Spring Data Redis的依赖。如果使用Maven,添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 如果使用Gradle,添加: ```groovy implementation 'org.springframework.boot:spring-boot-starter-data-redis' ``` 2. **配置Redis连接**:在application.properties或application.yml中配置Redis服务器信息。例如: ```properties spring.redis.host=localhost spring.redis.port=6379 ``` 3. **确保Bean定义**:Spring Boot会自动配置`StringRedisTemplate` Bean如果依赖正确添加。但有时需要自定义配置。可以创建一个配置类来定义Bean: ```java @Configuration public class RedisConfig { @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) { return new StringRedisTemplate(connectionFactory); } } ``` 确保这个配置类被组件扫描到。 4. **检查配置类**:用户提到`DelegatingWebMvcConfiguration`的`setConfigurers`方法。`DelegatingWebMvcConfiguration`通常用于扩展Web MVC配置。如果用户在自定义配置中使用了`StringRedisTemplate`,需要确保它被注入。 例如,如果用户有一个类实现了`WebMvcConfigurer`,并尝试注入`StringRedisTemplate`: ```java @Configuration public class MyWebMvcConfig implements WebMvcConfigurer { private final StringRedisTemplate stringRedisTemplate; @Autowired public MyWebMvcConfig(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; } // override methods } ``` 确保`StringRedisTemplate` Bean可用。 5. **错误处理**:如果仍然出错,检查Spring Boot启动日志,看是否有关于Redis配置的错误。确保Redis服务正在运行。 回答结构: - **解释问题**:简要说明错误原因。 - **提供解决方案**:分步指导用户如何解决。 - **验证**:建议如何验证修复。 - **相关问题**:生成相关问题,作为系统指令要求。 使用中文回答,确保LaTeX格式正确。行内数学表达式用$...$,独立公式用$$...$$。 生成相关问题: 1. 如何自定义Spring Boot中的Redis配置? 2. Spring MVC配置的最佳实践是什么? 3. 依赖注入失败的其他常见原因有哪些? 最终回答应清晰、可靠。</think>### Spring DelegatingWebMvcConfiguration 中 setConfigurers 方法找不到 StringRedisTemplate Bean 的解决方案 在 Spring Boot Web 应用开发中,`DelegatingWebMvcConfiguration` 是 Spring MVC 的核心配置类,用于处理 Web 相关配置。当您在 `setConfigurers` 方法中遇到找不到 `StringRedisTemplate` 类型 Bean 的错误时,通常是由于以下原因之一: - **依赖缺失**:未添加 Redis 相关依赖。 - **Bean 未配置**:`StringRedisTemplate` Bean 未被 Spring 容器正确创建或注入。 - **配置顺序问题**:Bean 加载顺序错误导致依赖无法解析。 - **环境配置错误**:Redis 连接参数未设置或服务未启动。 下面我将逐步指导您解决此问题,确保解决方案可靠且基于 Spring Boot 最佳实践。 --- ### 步骤 1: 添加 Redis 依赖 `StringRedisTemplate` 是 Spring Data Redis 提供的工具类。若项目中未引入相关依赖,Spring Boot 无法自动配置该 Bean。 **操作:** - 在 Maven 的 `pom.xml` 中添加依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` - 或 Gradle 的 `build.gradle` 中添加: ```groovy implementation 'org.springframework.boot:spring-boot-starter-data-redis' ``` 添加后,Spring Boot 会自动配置 `StringRedisTemplate` Bean(需正确配置 Redis 连接信息)[^1]。 --- ### 步骤 2: 配置 Redis 连接参数 在 `application.properties` 或 `application.yml` 中设置 Redis 服务器信息。以下示例使用 `application.properties`: ```properties # Redis 基本配置 spring.redis.host=localhost # Redis 服务器地址 spring.redis.port=6379 # Redis 端口 spring.redis.password= # 密码(如有) spring.redis.database=0 # 数据库索引 ``` 如果 Redis 服务未启动,您需要先启动 Redis 服务器(例如通过 Docker 或本地安装)。 --- ### 步骤 3: 确保 Bean 正确注入 `DelegatingWebMvcConfiguration` 的 `setConfigurers` 方法依赖于其他配置类(如 `WebMvcConfigurer` 实现)。如果您的自定义配置类中使用了 `StringRedisTemplate`,需显式注入它。 **示例配置类:** ```java @Configuration public class MyWebMvcConfig implements WebMvcConfigurer { private final StringRedisTemplate stringRedisTemplate; // 通过构造器注入确保依赖可用 @Autowired public MyWebMvcConfig(StringRedisTemplate stringRedisTemplate) { this.stringRedisTemplate = stringRedisTemplate; } @Override public void addInterceptors(InterceptorRegistry registry) { // 使用 stringRedisTemplate 实现自定义逻辑,例如拦截器 } } ``` **关键点:** - 使用 `@Autowired` 或构造器注入 `StringRedisTemplate`。 - 确保配置类位于主启动类(`@SpringBootApplication` 注解的类)的同包或子包下,以便组件扫描生效[^4]。 --- ### 步骤 4: 自定义 StringRedisTemplate Bean(可选) 如果自动配置失败(例如需自定义序列化方式),手动定义 Bean: ```java @Configuration public class RedisConfig { @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(connectionFactory); // 自定义序列化(可选) template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` --- ### 步骤 5: 验证问题是否解决 1. **检查启动日志**:运行应用,查看日志中是否包含 Redis 初始化信息,例如: ``` ... RedisConnectionFactory : Initializing Redis connection factory ... StringRedisTemplate : Bean initialized and available for injection ``` 2. **测试 Bean 注入**:添加一个测试 Controller 验证 `StringRedisTemplate` 是否可用: ```java @RestController public class TestController { @Autowired private StringRedisTemplate stringRedisTemplate; @GetMapping("/test") public String test() { stringRedisTemplate.opsForValue().set("key", "value"); return "Success!"; } } ``` 访问 `http://localhost:8080/test`,如果返回 "Success!" 且 Redis 中存入数据,则问题解决。 --- ### 常见错误排查 - **错误:`No qualifying bean of type 'StringRedisTemplate'`** - **原因**:依赖缺失或 Redis 连接失败。 - **解决**:检查 `spring-boot-starter-data-redis` 依赖是否添加,并确保 Redis 服务可用。 - **错误:Bean 加载顺序冲突** - **原因**:`DelegatingWebMvcConfiguration` 在 `StringRedisTemplate` 之前初始化。 - **解决**:使用 `@DependsOn` 注解显式声明依赖: ```java @Configuration @DependsOn("stringRedisTemplate") // 确保先加载 Redis Bean public class WebConfig extends DelegatingWebMvcConfiguration { // 配置内容 } ``` - **环境问题**:在 `logback-spring.xml` 中使用 `<springProfile>` 确保不同环境(如开发、生产)的 Redis 配置隔离[^3]。 --- ### 相关问题 1. **如何在 Spring Boot 中自定义 Redis 的序列化方式?** (涉及 `RedisTemplate` 的自定义配置和序列化器选择。) 2. **Spring MVC 配置中如何处理多个 `WebMvcConfigurer` 的冲突?** (讨论配置优先级和 `@Order` 注解的使用。) 3. **依赖注入失败时,Spring Boot 提供了哪些诊断工具?** (涵盖 `@Conditional` 注解、启动日志分析和 Actuator 端点。) 通过以上步骤,您的 `DelegatingWebMvcConfiguration` 应能正确解析 `StringRedisTemplate` 依赖。如果问题仍存,请检查项目依赖树(`mvn dependency:tree`)或提供更多配置代码片段以进一步分析。 [^1]: Spring Boot 启动时会自动加载 `spring-boot-starter-data-redis` 中的配置类,初始化 Redis 相关 Bean。 [^2]: `WebMvcProperties` 用于绑定 `spring.mvc` 下的配置项,但 Redis 配置需通过 `spring.redis` 单独设置。 [^3]: 日志配置支持环境隔离,避免因 Profile 设置错误导致配置未生效。 [^4]: `@SpringBootConfiguration` 和组件扫描机制确保配置类被正确加载。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值