httpClient调用失败来自servlet,错误为java.lang.NoSuchMethodError:

时间:2015-02-12 10:02:48

标签: java servlets post httpclient apache-httpclient-4.x

我正在尝试使用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组件库放在WEB_INF / lib里面(我希望这是正确的)libs的版本是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);
    }

}

对此方面的任何帮助或指示表示赞赏。 感谢

2 个答案:

答案 0 :(得分:1)

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

看到StringEntity类已从版本4开始导入,服务器/ lib可能具有加载的库的早期版本。

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

答案 1 :(得分:0)

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