如何在Spring的刻板印象类中使用@Autowired

问题描述 投票:1回答:2

我想在这个类中使用该存储库,但是当我放置像@Component这样的构造型时,我从IDE中得到一个错误:

无法自动装配。找不到“身份验证”类型的bean。

public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {

    @Autowired
    private FlatRepository flatRepository;

    public CustomMethodSecurityExpressionRoot(Authentication authentication) {
        super(authentication);
     }
}
java spring spring-boot inversion-of-control
2个回答
2
投票

你不能在@AutowireSecurityExpressionRoot。 但是,您可以手动提供FlatRepository依赖项。

当您在@Configuration类中配置Security对象时,您可以在@Autowire中使用所需的任何实例。

只需在CustomMethodSecurityExpressionRoot构造函数中为新的依赖项创建空间

class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot 
                                         implements MethodSecurityExpressionOperations {
    private final FlatRepository flatRepository;

    CustomMethodSecurityExpressionRoot(
            final Authentication authentication,
            final FlatRepository flatRepository) {
        super(authentication);
        this.flatRepository = flatRepository;
    }

    ...
}

并在实例化点手动注入它

final SecurityExpressionRoot root = new CustomMethodSecurityExpressionRoot(authentication, flatRepository);

0
投票

要使用bean的Autowired实例,您需要使用该实例的组件/服务也由Spring管理。因此,为了使用存储库,您需要弹出CustomMethodSecurityExpressionRoot类。您可以使用@Component / @Service批注对类进行批注,然后使用组件扫描进行选择,或使用Java或XML配置来配置bean。

如果“弹出”CustomMethodSecurityExpressionRoot,则需要确保spring对象上下文可以获取Authentication对象。这就是您收到无法找到身份验证的错误的原因。您还需要使用Java或XML创建Authentication类型的bean。

请查看官方文档,了解如何定义spring bean:

https://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html

© www.soinside.com 2019 - 2024. All rights reserved.