Spring cloud - Resttemplate不会被拦截注入

时间:2017-04-05 23:47:47

标签: java spring-boot interceptor resttemplate spring-cloud-netflix

我在Spring启动应用程序中创建了一个resttemplate,如下所示:

@Configuration
public class MyConfiguration {

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

这在自动装配时适用于所有类。但是,在我的拦截器中,这会引发nullpointer异常。

可能是什么原因以及如何在拦截器中配置loadbalanced(使用Ribbon)resttemplate?

更新

我的拦截器:

 public class MyInterceptor implements HandlerInterceptorAdapter {

  @Autowired
  RestTemplate restTemplate;

  public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler)
    throws Exception {

    HttpHeaders headers = new HttpHeaders();
    ...
    HttpEntity<String> entity = new HttpEntity<String>(headers);

    //restTemplate is null here
    ResponseEntity<String> result = 
    restTemplate.exchange("<my micro service url using service name>", 
                          HttpMethod.POST, entity, String.class);
    ...

    return true;
}

拦截器被添加到弹簧启动应用程序中,如下所示:

@Configuration  
public class MyConfigAdapter extends WebMvcConfigurerAdapter  {

@Override
public void addInterceptors(InterceptorRegistry registry) {
   registry.addInterceptor(new MyInterceptor()).addPathPatterns("/*");
    }
}

1 个答案:

答案 0 :(得分:1)

你误解了@Autowired的工作原理。只要您new MyInterceptor()方法之外@Bean,它就不会自动装配。

执行以下操作:

@Configuration  
public class MyConfigAdapter extends WebMvcConfigurerAdapter  {

    @Autowired
    MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/*");
    }
}