Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc Spring boot无法访问ClientHttpRequestInterceptor中的@Value_Spring Mvc_Spring Boot_Resttemplate_Spring Restcontroller_Spring Rest - Fatal编程技术网

Spring mvc Spring boot无法访问ClientHttpRequestInterceptor中的@Value

Spring mvc Spring boot无法访问ClientHttpRequestInterceptor中的@Value,spring-mvc,spring-boot,resttemplate,spring-restcontroller,spring-rest,Spring Mvc,Spring Boot,Resttemplate,Spring Restcontroller,Spring Rest,我正在使用spring-boot-1.3.3。我想截取Rest模板,我可以截取它,但我无法访问application.properties。它总是返回null package com.sample.filter; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRe

我正在使用spring-boot-1.3.3。我想截取Rest模板,我可以截取它,但我无法访问application.properties。它总是返回null

package com.sample.filter;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class HeaderInterceptor implements ClientHttpRequestInterceptor{

private static final String CLIENT_HEADER = "x-client";

@Value("${clientHeader}")
private String ClientHeader;

@Override
public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    HttpHeaders headers = httpRequest.getHeaders();
    headers.add(CLIENT_HEADER, ClientHeader);
    return execution.execute(httpRequest, body);
}
}
我总是将“clientHeader”键设置为null


任何帮助都应该是可观的。

我看到您在评论中提到,您正在通过
new
关键字在代码中自己创建拦截器。为了使用HeaderInterceptor的spring上下文实例,您需要在代码中自动连接它。然后,它将具有spring托管属性的可见性。

您可以为拦截器配置@Bean,这将确保@Autowired字段确实是自动连接的,然后使用它们来配置客户端

之前:

client.setInterceptors(new ClientInterceptor[] {new CustomInterceptor()});
之后:

 @Bean
 public CustomInterceptor customInterceptor() {
    return new CustomInterceptor();
 }

 //in the client construction, set the interceptor as below.
 client.setInterceptors(new ClientInterceptor[] {customInterceptor()});

 

你不是自己在创建拦截器吗?(
new HeaderInterceptor()
在您的代码中)?是的。我正在创建拦截器,并将此拦截器添加到restTemplate setInterceptors方法中。它工作正常。我只是想测试我们是否可以使用@value动态传递值,但失败了。就像ritesh sugested一样,即使您已经注释了要由spring(@Component)管理的HeaderInterceptor。但是通过使用新操作符,实例化的HeaderInterceptor不是spring管理的,因此无法访问任何上下文值。拦截器在您的情况下工作,因为没有任何东西阻止流(只是clientHeader属性变为null)。自动连接HeaderInterceptor并在restTemplate的setInterceptor方法中使用该自动连接属性。可以动态传递该值。