自动装配Spring Boot类

时间:2017-04-12 06:02:51

标签: spring spring-boot

我有一些代码尝试自动装配包含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;
    }
}

当我尝试自动加载RequestPublicKey时,它会返回null。我认为这是因为我用RestTemplate实例化了RestTemplate restTemplate = new RestTemplate()。为了解决这个问题,我试图像这样自动加载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 requestPublicKey = new RequestPublicKey()

2 个答案:

答案 0 :(得分:0)

正如评论中已经说过的,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

中的详细信息

希望这有帮助。

答案 1 :(得分:0)

我现在就开始工作了。我有两个自动装配问题。第一个问题是,GenericFilterBean的自动装配需要一些额外的设置。我找到了设置here (link to SO)here (link to SO)的方法。第二个问题是如何自动装配RestTemplate。我和Ralf's solution一起去了。感谢您的帮助。