【问题标题】:Autowire Spring Boot classes自动装配 Spring Boot 类
【发布时间】:2017-09-07 18:12:36
【问题描述】:

我有一些代码试图自动装配一个包含 Spring Boot 类 RestTemplate 的 Bean。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.filter.GenericFilterBean;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class JWTAuthenticationFilter extends GenericFilterBean{

    @Autowired
    RequestPublicKey requestPublicKey;

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
                throws IOException, ServletException {

            System.out.println(requestPublicKey.getPublicKey());
            filterChain.doFilter(request, response);

        }
}

RequestPublicKey 类的初始代码如下所示:

@Component
public class RequestPublicKey {

    public String getPublicKey(){
        RestTemplate restTemplate = new RestTemplate();
        String publicCreds = restTemplate.getForObject("http://localhost:8081/get-public-key?kid=bf3b7429-261e-48c5-8409-79e1c9f203de", String.class);
        return publicCreds;
    }
}

当我尝试 Autowire RequestPublicKey 时,它会返回 null。我认为这是因为我用RestTemplate restTemplate = new RestTemplate() 实例化了RestTemplate。为了解决这个问题,我尝试像这样 Autowire RestTemplate

@Component
public class RequestPublicKey {

    @Autowired
    private RestTemplate restTemplate;

    public String getPublicKey(){
        String publicCreds = restTemplate.getForObject("http://localhost:8081/get-public-key?kid=bf3b7429-261e-48c5-8409-79e1c9f203de", String.class);
        return publicCreds;
    }
} 

但后来我得到了Could not autowire. No beans of type RestTemplate found。

是否可以自动装配 Spring Boot 类?还是应该像 RequestPublicKey requestPublicKey = new RequestPublicKey() 一样实例化 RequestPublicKey?

【问题讨论】:

  • 你是否在配置中定义了RestTemplate bean?我怀疑你没有
  • @Mr.Arjun。没有没有在配置中定义它。你有什么例子吗?抱歉,我刚开始学习 Spring Boot 和 Spring。
  • 你可以编辑问题并在那里添加配置代码
  • 没有必要将RestTemplate 设为spring bean。但是你是说如果你在任何地方自动连接RequestPublicKey 它是空的。这不应该是这样。你能展示一下RequestPublicKey是自动连线的类吗?
  • 尝试在RequestPublicKey上添加构造函数

标签: spring spring-boot


【解决方案1】:

正如 cmets 中已经说过的,Spring 不会自动为您提供 RestTemplate。因此,您要么必须自己设置,例如

@Configuration
public class MyConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

或者您使用 Spring(引导)提供的 RestTemplateBuilder,因此可以让 Spring 将其注入您的代码。

@Component
public class RequestPublicKey {

    private final RestTemplate restTemplate;

    @Autowired
    public RequestPublicKey(RestTemplateBuilder restTemplateBuilder) {
         this.restTemplate = restTemplateBuilder.build();
    }
    ...

这有一些好处,例如 Spring 为您设置 HttpMessageConverters,您可以使用 RestTemplateCustomizer。在Spring Boot Docs 中查看更多信息。

希望这会有所帮助。

【讨论】:

  • 谢谢,我会试一试。我现在意识到,当我尝试从JWTAuthenticationFilter 自动连接RequestPublicKey 时,我的问题更早了。我尝试直接在JWTAuthenticationFilter 中运行RestTemplate,它成功了。
【解决方案2】:

我现在开始工作了。自动装配有两个问题。第一个问题是从GenericFilterBean 自动接线需要一些额外的设置。我找到了一种设置它的方法here (link to SO) 和here (link to SO)。第二个问题是如何自动连接RestTemplate。我选择了Ralf's solution。感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2020-04-29
    相关资源
    最近更新 更多