Spring中@Autowired注解依赖注入失败问题排查
问题:编译报错找不到HmacGenerator类
错误信息
#9 29.22 [ERROR] /src/main/java/com/nestwealth/ftpintegration/onboarding/response/OnboardingResponseRoute.java:[15,16] cannot find symbol #9 29.22 [ERROR] symbol: class HmacGenerator #9 29.22 [ERROR] location: class com.nestwealth.ftpintegration.onboarding.response.OnboardingResponseRoute
相关代码
HmacGenerator.java
package com.example.ftpintegration; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Value; import org.json.JSONObject; @Component public class HmacGenerator { private String secretKey; private static final Logger log = LoggerFactory.getLogger(HmacGenerator.class); public HmacGenerator(@Value("${secret-key}") String secretKey){ this.secretKey = secretKey; } public String generateHmacKey (String sftpResponseObj){ log.warn("SFTP response: (" + sftpResponseObj); String encodingType = "HmacSHA256"; JSONObject obj = new JSONObject(sftpResponseObj); log.warn("Stringified SFTP response: (" + obj.toString()); return "test"; } }
OnboardingResponseRoute.java
package com.example.ftpintegration.onboarding.response; import org.apache.camel.Exchange; import org.apache.camel.builder.endpoint.EndpointRouteBuilder; import org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; @Component public class OnboardingResponseRoute extends EndpointRouteBuilder { private JdbcMessageIdRepository idempotentRepository; @Autowired public HmacGenerator hmacgenerator; // 报错位置 public OnboardingResponseRoute(JdbcMessageIdRepository sftpOnboardingProcessor) { this.idempotentRepository = sftpOnboardingProcessor; } @Override public void configure() throws Exception { from(sftp("{{sftp.host}}:{{sftp.port}}/{{sftp.path}}") .username("{{sftp.user}}") .password("{{sftp.password}}") .recursive(false) .useUserKnownHostsFile(false) .delay("{{response.sftp.delay}}") .delete(false) .idempotent(true) .idempotentRepository(idempotentRepository) .advanced() .stepwise(false) .localWorkDirectory("{{sftp.tmp-directory}}")) .setHeader(Exchange.HTTP_METHOD, constant("POST")) .setHeader(Exchange.CONTENT_TYPE, constant("application/json")) .setHeader("x-digest") .method(hmacgenerator, "generateHmacKey(${body})") .log("Started copying file: ${header.CamelFileName}") .to("{{response.http.url}}/account-opening-response") .log("Done copying file: ${header.CamelFileName}"); } }
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.nestwealth</groupId> <artifactId>ftpintegration</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ftpintegration</name> <description>SFTP to S3 Integration</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-spring-boot-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-bean-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-ftp-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-aws2-s3-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-http-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-55</artifactId> <version>2.14.0</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jackson-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jpa-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-sql-starter</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-endpointdsl</artifactId> <version>3.11.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20220924</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
解决方法
1. 补全类导入语句
在OnboardingResponseRoute.java顶部添加HmacGenerator的导入:
import com.example.ftpintegration.HmacGenerator;
如果实际项目包名和pom.xml的groupId一致(com.nestwealth),需要先把HmacGenerator的包声明改成package com.nestwealth.ftpintegration;,再把导入语句对应改成import com.nestwealth.ftpintegration.HmacGenerator;。
2. 统一Spring注入方式
由于类已经有自定义构造函数,Spring不会自动生成无参构造,混合字段注入和构造注入容易出问题,改成全构造注入:
private JdbcMessageIdRepository idempotentRepository; private HmacGenerator hmacgenerator; @Autowired public OnboardingResponseRoute(JdbcMessageIdRepository sftpOnboardingProcessor, HmacGenerator hmacgenerator) { this.idempotentRepository = sftpOnboardingProcessor; this.hmacgenerator = hmacgenerator; }
同时去掉字段上的@Autowired注解。
3. 修复HmacGenerator的日志未定义问题
原代码中直接使用log.warn()但未初始化日志对象,添加:
private static final Logger log = LoggerFactory.getLogger(HmacGenerator.class);
内容的提问来源于stack exchange,提问作者RRP
相关产品推荐
相关产品推荐

