httpClient post call failing from a servlet with error java.lang.NoSuchMethodError:

httpClient post call failing from a servlet with error java.lang.NoSuchMethodError:

我正在尝试使用 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 对象的时候

我查了另一个 post 他们说,这主要是因为构建路径不一致,我把所有的 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);
    }

}

在此方面提供任何帮助或指导,我们将不胜感激。 谢谢

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

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

看到StringEntityclass是从版本4开始引入的,有可能是server/lib加载了更早版本的库。

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