java 创建自定义 RestTemplate 时 Spring-boot 出错
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/38779071/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring-boot gets an error when creating custom RestTemplate
提问by Shofwan
I have a sendGetREST
method to send some URL endpoint
and get the response:
我有一种sendGetREST
方法可以发送一些URL endpoint
并获得响应:
@Component
public class HttpURLCommand {
private static Logger logger = Logger.getLogger(HttpURLCommand.class);
public String sendGetREST(String soapUrl, Object[] parameters) throws IOException{
final String SOAP_URL = MessageFormat.format(soapUrl, parameters);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(SOAP_URL, String.class);
logger.info("status code is: "+response.getStatusCode());
if(response.getStatusCode().equals(HttpStatus.OK)){
logger.info("send success");
return response.getBody();
}
else {
logger.info("send failed");
return null;
}
}
}
Which is working well. However, in order to make the timeout time customizable, I have this HTTPConfiguration
from this tutorial:
哪个运行良好。但是,为了使超时时间可自定义,我HTTPConfiguration
从本教程中获得了以下内容:
@Configuration
public class HTTPConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(60000);
factory.setConnectTimeout(60000);
return factory;
}
}
So the class will be calling restTemplate like this:
因此,该类将像这样调用 restTemplate:
@Component
public class HttpURLCommand {
private static Logger logger = Logger.getLogger(HttpURLCommand.class);
@Autowired
RestTemplate restTemplate;
public String sendGetREST(String soapUrl, Object[] parameters) throws IOException{
final String SOAP_URL = MessageFormat.format(soapUrl, parameters);
ResponseEntity<String> response = restTemplate.getForEntity(SOAP_URL, String.class);
logger.info("status code is: "+response.getStatusCode());
if(response.getStatusCode().equals(HttpStatus.OK)){
logger.info("send success");
return response.getBody();
}
else {
logger.info("send failed");
return null;
}
}
}
But unfortunately return this following error when builds the spring-boot
app:
但不幸的是,在构建spring-boot
应用程序时返回以下错误:
Caused by: java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext
at com.xl.MbbI.config.HTTPConfiguration.clientHttpRequestFactory(HTTPConfiguration.java:25) ~[classes/:na]
at com.xl.MbbI.config.HTTPConfiguration.restTemplate(HTTPConfiguration.java:21) ~[classes/:na]
at com.xl.MbbI.config.HTTPConfiguration$$EnhancerBySpringCGLIB$1f99f.CGLIB$restTemplateorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restTemplate' defined in class path resource .....
(<generated>) ~[na:na]
at com.xl.MbbI.config.HTTPConfiguration$$EnhancerBySpringCGLIB$1f99f$$FastClassBySpringCGLIB$30ce57.invoke(<generated>) ~[na:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.0.RC2.jar:4.3.0.RC2]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) ~[spring-context-4.3.0.RC2.jar:4.3.0.RC2]
at com.xl.MbbI.config.HTTPConfiguration$$EnhancerBySpringCGLIB$1f99f.restTemplate(<generated>) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_60]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_60]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.7.0_60]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.7.0_60]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.0.RC2.jar:4.3.0.RC2]
... 24 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.apache.http.protocol.HttpContext
at java.net.URLClassLoader.run(Unknown Source) ~[na:1.7.0_60]
at java.net.URLClassLoader.run(Unknown Source) ~[na:1.7.0_60]
at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_60]
at java.net.URLClassLoader.findClass(Unknown Source) ~[na:1.7.0_60]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.7.0_60]
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) ~[na:1.7.0_60]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[na:1.7.0_60]
... 36 common frames omitted
FYI the error is much more than displayed above.
仅供参考,错误比上面显示的要多得多。
The first line is something like:
第一行是这样的:
Caused by: java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext
回答by NangSaigon
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
The error shows that there was a problem with your classpath, it could be because there is no class or.apache.http.protocol.HttpContext in your classpath. This class is often used by Spring RestTemplate. Normally we can find this class in the Apache httpclient library. You should check again your dependencies. If you can not find it, you can consider to add below dependency (if you use Maven)
该错误表明您的类路径存在问题,可能是因为您的类路径中没有类或 .apache.http.protocol.HttpContext。这个类经常被 Spring RestTemplate 使用。通常我们可以在 Apache httpclient 库中找到这个类。您应该再次检查您的依赖项。如果找不到,可以考虑添加以下依赖(如果使用Maven)
##代码##