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 打印出此信息,这可能是需要筛选的大量数据。
我正在尝试使用 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 打印出此信息,这可能是需要筛选的大量数据。