You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:51:38