2017-08-14 115 views
2

在春天引导我试图创建一个使用春季启动RestTemplate基本身份验证使用RestTemplateBuilder

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    builder.basicAuthorization("username", "password"); 
    RestTemplate template = builder.build(); 
    return template; 
} 

然后我在服务类注入RestTemplate一个RestTemplate将使用基本身份验证

@Autowired 
private RestTemplate restTemplate; 

但是,我的请求失败,出现401未经授权的异常:

Caused by: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized 

使用另一个REST客户端(Postman),对相同URL的请求成功,因此我假设基本身份验证无法正常工作。从调试输出看起来好像认证头没有被设置。什么会使这项工作?

+0

去调试,看看它是否正确设置头,我的猜测是你有更多的resttemplate在你的春天的上下文。 – Jaiwo99

+0

春天里只有一个RestTemplate。 –

+1

分享你的客户端代码..如何发送请求 –

回答

0

一种解决方案是如下创建RestTemplate:

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    RestTemplate template = builder.build(); 
    template.setMessageConverters(
     Arrays.asList(
      new FormHttpMessageConverter(), 
      new StringHttpMessageConverter() 
     ) 
    ); 
    template.getInterceptors().add(new BasicAuthorizationInterceptor("username", "password")); 

    return template; 
} 
3

的问题是,你是在一个错误的方式使用RestTemplateBuilderRestTemplateBuilder是不可变的。因此,在执行builder.basicAuthorization("username", "password")时,您实际上会获得一个新实例,其中BasicAuthorizationInterceptor已被添加并配置为RestTemplateBuilder。 (这适用于所有RestTemplateBuilder的配置方法,它们都会创建一个新的复制实例)。

但是,您的代码将丢弃该特定配置的实例,并且基本上使用非安全默认值RestTemplateBuilder

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    builder.basicAuthorization("username", "password"); 
    RestTemplate template = builder.build(); 
    return template; 
} 

这段代码应该替换成类似这样的东西。

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    return builder.basicAuthorization("username", "password").build(); 
} 

这将使用特定配置的实例。

+0

非常感谢,是的,这是问题所在。 –

相关问题