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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 03:45:35  来源:igfitidea点击:

Spring-boot gets an error when creating custom RestTemplate

javaspringspring-mvcspring-bootjavabeans

提问by Shofwan

I have a sendGetRESTmethod to send some URL endpointand 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 HTTPConfigurationfrom 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-bootapp:

但不幸的是,在构建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$restTemplate
org.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)

##代码##