5

I am running an application on tomcat server. I am getting following error while callling a specific function :

java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy

My class is :

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
/*import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;*/
//import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.log4j.Logger;
import org.performics.air.business.common.data.HttpParam;

public class SendAndReceiveUtil implements Serializable {
//FIXME: move to suitable package
    /**
     * 
     */
    private static final long serialVersionUID = 2649891233958197253L;
    private static Logger LOG = Logger.getLogger(SendAndReceiveUtil.class);


    public static String httpPostWithTLS(String request,String url,Map<String,String> headerParameterMap){
        String responseStr = null;
        try{
            // FIXME: need to handle supplier timeout and gzip

            String contentType="";
            String soapAction="";               
            boolean zipForRequest=false;
            boolean acceptEncoding = false; 
            boolean zipForResponse=false;
            if (headerParameterMap!=null){
                contentType=headerParameterMap.get(HttpParam.CONTENTTYPE.toString())!=null?headerParameterMap.get(HttpParam.CONTENTTYPE.toString()):"";
                zipForRequest=(headerParameterMap.containsKey(HttpParam.ZIPFORREQUEST.toString()))? new Boolean(headerParameterMap.get(HttpParam.ZIPFORREQUEST.toString())):false;
                acceptEncoding=(headerParameterMap.containsKey(HttpParam.ACCEPT_ENCODING.toString()))? new Boolean(headerParameterMap.get(HttpParam.ACCEPT_ENCODING.toString())):false;
                zipForResponse=(headerParameterMap.containsKey(HttpParam.ZIPFORRESPONSE.toString()))? new Boolean(headerParameterMap.get(HttpParam.ZIPFORRESPONSE.toString())):false;
                soapAction=headerParameterMap.get(HttpParam.SOAPACTION.toString())!=null?headerParameterMap.get(HttpParam.SOAPACTION.toString()):"";
            }

            SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(null,new TrustSelfSignedStrategy()).build();
            // Allow TLSv1.2 protocol only, use NoopHostnameVerifier to trust self-singed cert
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1.2" }, null, new NoopHostnameVerifier());
            //do not set connection manager
            HttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("SOAPAction", soapAction);

            StringEntity mEntity = new StringEntity(request, "UTF-8");

            if(StringUtils.isNotBlank(contentType)){
                mEntity.setContentType(contentType);
                mEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,contentType));
            }else{
                mEntity.setContentType("text/xml;charset=UTF-8");
                mEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING,"gzip"));
            }
            httpPost.addHeader("Content-Encoding", "gzip" );
            httpPost.addHeader("Accept-Encoding", "gzip,deflate" );
            if(null!=headerParameterMap.get("Cookie")){
                httpPost.addHeader("Cookie", headerParameterMap.get("Cookie"));
            }
            httpPost.setEntity(mEntity);
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity et=response.getEntity();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            et.writeTo(os);

            responseStr = new String(os.toByteArray());
            }catch(Exception e){
                LOG.error(e.getMessage(), e);
            }
        return responseStr;
    } 
}

Error comes on calling httpPostWithTLS() function. I searched about it on net and found that class was available at compile but is not available at run time, but i am unable to correct it. I am using following http jars:

  • commons-httpclient-3.1.jar
  • httpclient-4.5.3.jar
  • httpcore-4.4.6.jar
  • httpclient-cache-4.5.3.jar
  • httpclient-win-4.5.3.jar
  • httpmime-4.5.3.jar
1
  • Are you deploying to Tomcat using WAR archive? Could you show your POM descriptor? Commented Dec 7, 2017 at 8:00

1 Answer 1

3

Try to add the httpcore-4.4.6.jar and httpclient-cache-4.5.3.jar to server library and check.

I do face the similar issue after adding these jar file, my problem is resolved.

Thanks,

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.