【问题标题】:Spring Boot - Autowiring null inside abstract classSpring Boot - 在抽象类中自动装配 null
【发布时间】:2019-11-02 10:59:13
【问题描述】:

我有以下课程。

public interface Operation
public abstract class AbstractOperation  implements Operation
public class Operation extends AbstractOperation

类操作

public interface Operation {
     GenericClientResponse validateCustomerId();

类抽象操作

public abstract class AbstractOperation  implements Operation {

    protected GenericClientRequest buildClientValidationRequest() {
        return new GenericClientRequest();
    }

在 Operation 类中有自动装配的属性。

public class Operation extends AbstractOperation {
    @Autowired
    UserAccountsRepository userAccountsRepository; // not autowiring
    @Autowired
    WebClient.Builder webClientBuilder; // not autowiring

但是这些属性都不是自动装配的。它们在运行时为空。 但是如果我在我的服务类中自动装配这些,自动装配就成功了。

    @Service
    @Transactional
    public class TransactionServiceImpl implements TransactionService {

          @Autowired
          UserAccountsRepository userAccountsRepository; // Autowires successfully.

请在下面找到存储库类。

public interface UserAccountsRepository extends 
             JpaRepository<UserAccountsEntity, Integer> {

    @Query("SELECT account FROM UserAccountsEntity account where 
                 account.accountNo = :acc")
    UserAccountsEntity getAccountByAccNo(@Param("acc") String userId);

在我的代码中,我保留了一个操作类的映射,并根据一个键获取相关的操作类。

 operationMap.put("test_op1", new Operation());
 operationMap.put("test_op2", new Operation2());

然后我调用它以获得正确的操作

Optional.ofNullable(operationMap.get("test_op1"));

现在我不明白创建新实例会导致空自动装配。如何在没有新关键字的情况下获得新对象?

【问题讨论】:

  • 您能否在您的代码中添加一些细节: 1. 您展示的所有类和main 引导类的包。 2. 课堂注解Operation.
  • 你能展示你如何实例化Operation吗?
  • 请参考我更新的问题@priyank-sriv
  • 请参考我更新的问题@HasanCanSaral
  • 在您的更新@bynu022 中没有回答我的问题。

标签: java spring spring-boot abstract-class autowired


【解决方案1】:

您可能正在用new 实例化Operation,如下所示:

Operation operation = new Operation(...);

这使您的 Operation 实例非 Spring 托管。因此,由于 Spring 不知道您的实例,它无法自动装配您的依赖项。

如果你喜欢:

@Component
public class Operation {
...
}

您将正确地自动装配您的依赖项。如果您确实需要自己实例化Operation 并保留自动装配的依赖项,则需要使用Configurable。查看一些参考资料:

【讨论】:

  • 是的,你是对的。我正在创建新实例以从地图中获取相关操作。请参考我更新的问题
  • 这就是重点。这回答了你的问题。 Spring 无法将 bean 自动装配到您使用 new 创建的实例。将它们标记为@Component(不带new)并在需要时自动连接Operation,或者使用@Configurable
  • 你看我的回答了吗?参考您需要做什么:@Configurable。但这是一件非常昂贵的事情,而且不仅仅是添加@Configurable。请参考链接。
【解决方案2】:

根据您分享的内容,我可以看到几种可能性:

  1. 包结构不正确 - 如果类 Operationmain 类不在同一个包(或子包)中,则组件扫描可能会选择您的类。 请参考this 的回答,以确保您已正确实现包结构。

  2. 您可能缺少 Operation 类的 Spring 注释,例如 @Component@Service。或者,您可能在 Spring 应用程序上下文之外的代码中手动实例化该类。请验证您是否正确地创建了 bean。

如果您尝试手动创建 bean,您应该在配置类中使用 using @Bean

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2013-11-11
    • 2018-12-03
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多