httpClient post 调用从 servlet 失败并出现错误 java.lang.NoSuchMethodError:

Posted

技术标签:

【中文标题】httpClient post 调用从 servlet 失败并出现错误 java.lang.NoSuchMethodError:【英文标题】:httpClient post call failing from a servlet with error java.lang.NoSuchMethodError: 【发布时间】:2015-04-13 00:18:06 【问题描述】:

我正在尝试使用 apache http-components 客户端库从 servlet 进行 http post 调用,但遇到以下错误。

java.lang.NoSuchMethodError:org.apache.http.entity.StringEntity.(Ljava/lang/String;Lorg/apache/http/entity/ContentType;)V 在 org.apache.http.client。 entity.UrlEncodedFormEntity.(UrlEncodedFormEntity.java:77)

在我尝试在代码中创建 UrlEncodedEntity 对象时

我查看了另一篇帖子,他们说,这主要是因为构建路径的差异,我将所有 http-components 的库放在 WEB_INF/lib 中(我希望这是正确的)库的版本是 4.4 .这是我写的代码。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

    PrintWriter out =response.getWriter();
    out.println("Hit");
    String serviceUrl = request.getParameter("url");
    String data = request.getParameter("data");
    String type = request.getParameter("type");
    String dataType = request.getParameter("dataType");

    if(null != serviceUrl && !serviceUrl.trim().equals(""))    

            if(type.equalsIgnoreCase("POST"))
                try 
                    HttpClient client = new DefaultHttpClient();
                    HttpPost post = new HttpPost("http://10.53.204.233:6504/app/service/"+serviceUrl);
                    try 

                      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

                      nameValuePairs.add(new BasicNameValuePair("type",type ));
                      nameValuePairs.add(new BasicNameValuePair("dataType",dataType ));
                      nameValuePairs.add(new BasicNameValuePair("data",data ));
                      UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
                      post.setEntity(entity);


                      HttpResponse responseTeamServer = client.execute(post);
                      BufferedReader rd = new BufferedReader(new InputStreamReader(responseTeamServer.getEntity().getContent()));
                      String line = "";
                      StringBuilder sb = new StringBuilder();

                      while ((line = rd.readLine()) != null) 
                          sb.append(line);
                      

                      response.getWriter().write(sb.toString());
                      response.getWriter().flush();
                      response.getWriter().close();


                    
                    catch (IOException e) 
                      e.printStackTrace();
                    

                 finally 

                
            
            else

            
        

    else 
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
    


感谢您提供这方面的任何帮助或指导。 谢谢

【问题讨论】:

我也有类似的问题。你解决了吗? @Dan 我认为问题是类路径中库的多个版本。 【参考方案1】:

你的代码编译了吗?你在运行时遇到过这个问题吗?在这种情况下,您的类路径中有多个版本的库。

看到 StringEntity 类是从版本 4 开始引入的,服务器/lib 有可能加载了较早版本的库。

调试它的一种方法是添加 java -verbose:class 到您的服务器启动脚本。它将输出类信息,其中包括加载类的路径(jar)文件。请注意,它会为每个加载的类打印出这个,这可能是需要筛选的大量数据。

【讨论】:

是的,代码编译,这个错误是在运行时。感谢您提供调试提示。【参考方案2】:

正如 javadoc 所说,这个构造函数接受一个字符串作为第二个参数,而不是一个 Charset 对象

【讨论】:

hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…, 文档包含带有字符集的构造函数

以上是关于httpClient post 调用从 servlet 失败并出现错误 java.lang.NoSuchMethodError:的主要内容,如果未能解决你的问题,请参考以下文章

MVC HttpClient多个post请求,得到不匹配的响应

C#用httpclient模拟post到web网站上

HttpClient--使用HttpClient进行Get Post请求访问

POST 没有调用预期的方法

HttpClient Post 提交表单数据

无法通过 HTTPClient 向 REST 发送 post 请求