今天自己在升级公司的一个jar后,一直报空指针异常。代码如下

package com.zhuanche.http;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC; import java.io.File;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.*; import static com.sq.common.okhttp.constants.OkHttpConfig.DEFAULT_HEADER_ACCEPT_ENCODING;
import static com.sq.common.okhttp.constants.OkHttpConfig.DEFAULT_HEADER_ACCEPT_ENCODING_VALUE;
import static com.sq.common.okhttp.constants.OkHttpConfig.DEFAULT_HEADER_REQLOGIGNORE; /**
* 处理post请求
* @author huiwu
*/
public final class PostRequest extends Request{ private static final Logger logger = LoggerFactory.getLogger(PostRequest.class); private HttpPost post = null; private HttpClient client = null; private HttpEntity httpEntity = null; private final static String TRACEKEY = "X-Request-Id"; private final static String TRACEID = "traceId"; private static final String CHARNULL = ""; private final List<NameValuePair> params = new ArrayList<NameValuePair>(); private static final String DEFAULTCHARSET = "UTF-8"; private String charset = DEFAULTCHARSET; public PostRequest(HttpClient client, String url) {
this.client = client;
this.addHeaders(null);
post = new HttpPost(url);
} public PostRequest(HttpClient httpClient, String url,
String charset) {
this(httpClient,url);
this.charset = charset;
this.addHeaders(null);
} public PostRequest addHeader(String name, Object value) {
if (value == null) {
return this;
}
if(StringUtils.isNotEmpty(name)){
post.addHeader(name, String.valueOf(value));
}
return this;
} public PostRequest addHeaders(Map<String,Object> headers){
//nginx统一是TRACE_KEY,项目里面有些是traceId 所以做的兼容
logger.info("tracekey:" + TRACEKEY + ",value:" + MDC.get(TRACEKEY));
addHeader(DEFAULT_HEADER_REQLOGIGNORE, String.valueOf(false));
addHeader(DEFAULT_HEADER_ACCEPT_ENCODING, DEFAULT_HEADER_ACCEPT_ENCODING_VALUE);
if(MDC.get(TRACEKEY) != null){
addHeader(TRACEKEY,MDC.get(TRACEKEY));
}else if(MDC.get(TRACEID) != null){
addHeader(TRACEKEY,MDC.get(TRACEID));
}else {
addHeader(TRACEKEY,CHARNULL);
} if (headers==null||headers.isEmpty()) {
return this;
}
Set<String> keySets = headers.keySet();
Iterator<String> it = keySets.iterator();
while (it.hasNext()){
String key = it.next();
addHeader(key, headers.get(key));
}
return this;
} public PostRequest addParam(String name, Object value) {
if (value == null) {
return this;
}
params.add(new BasicNameValuePair(name, String.valueOf(value)));
return this;
}
public PostRequest addParams(Map<String,Object> map) {
if (map == null||map.isEmpty()) {
return this;
}
Set<String> keys = map.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()){
String paramName = it.next();
addParam(paramName,map.get(paramName));
}
return this;
} /**
* 设置body后,通过addParam方法添加的参数将不会设置到请求中
* @param body
* @return
*/
public PostRequest setBody(String body) {
return setBody(body,ContentType.TEXT_PLAIN);
} /**
* 设置body后,通过addParam方法添加的参数将不会设置到请求中
* @param body
* @return
*/
public PostRequest setBody(String body,ContentType contentType) {
try {
if (body==null) {
return this;
}
httpEntity = new StringEntity(body,charset);
} catch (Exception e) {
logger.error("set String body error ", e);
}
return this;
} public PostRequest setLimitResult(int limitResult) {
this.limitResult = limitResult;
return this;
} /**
* 添加文件参数,一个POST请求添加一个文件参数
* @param name 上传文件的参数名
* @param file
* @return
*/
public Request addFile(String name, File file) {
try {
addFile(name, file, ContentType.DEFAULT_BINARY);
} catch (Exception e) {
logger.error("set File body error ", e);
}
return this;
} /**
* 添加文件参数,一个POST请求添加一个文件参数
* @param name 上传文件的参数名
* @param file
* @param contentType 默认为 application/octet-stream
* @return
*/
public Request addFile(String name, File file,ContentType contentType) {
try {
if (contentType==null) {
contentType = ContentType.DEFAULT_BINARY;
}
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addBinaryBody(name, file, contentType,file != null ? file.getName() : null);
builder.setCharset(Charset.forName(charset));
if (params!=null&&!params.isEmpty()) {
for (NameValuePair nv : params) {
builder.addTextBody(nv.getName(),nv.getValue());
}
}
httpEntity = builder.build();
} catch (Exception e) {
logger.error("set File error ", e);
}
return this;
} public String execute()throws HttpException {
return exc(String.class);
} @Override
public JSONObject executeToJson()throws HttpException {
return exc(JSONObject.class);
} public <T>T executeToObject(Class<T> clazz)throws HttpException{
return exc(clazz);
} public PostRequest setIgnoreResult(boolean ignoreResult) {
this.ignoreResult = ignoreResult;
return this;
} @SuppressWarnings("unchecked")
private <T> T exc(Class<T> clazz) throws HttpException {
T obj = null;
int status = ;
String result = null;
Integer inputSize = ;
String lbrqid = "";
String x_ca_requestid = "";
long startTime = System.currentTimeMillis();
try {
if (httpEntity==null) {
httpEntity = new UrlEncodedFormEntity(params,charset);
}
post.setEntity(httpEntity);
post.setConfig(getRequestConfig());
HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
try {
// traceid唯一ID
Header[] headers = response.getHeaders("lbrqid");
if (null != headers && headers.length > ) {
lbrqid = headers[].getValue();
} // 阿里接口响应ID
Header[] headers2 = response.getHeaders("X-Ca-Request-Id");
if (null != headers2 && headers2.length > ) {
x_ca_requestid = headers2[].getValue();
}
if(StringUtils.isEmpty(lbrqid)){
lbrqid = x_ca_requestid;
}
// 获取字节大小
InputStream content = entity.getContent();
inputSize = content.available();
} catch (Exception e) {
logger.error("获取头信息异常.", e);
}
status = response.getStatusLine().getStatusCode();
if (entity!=null) {
try {
ContentType ct = ContentType.get(entity);
result = EntityUtils.toString(entity, charset);
if (clazz==null||clazz == String.class){
if (StringUtils.isNotBlank(result)){
obj = (T) result;
}
}else if (ContentType.APPLICATION_JSON.getMimeType().equals(ct.getMimeType())){
if (clazz == JSONObject.class){
if (StringUtils.isNotBlank(result)){
obj = (T) JSON.parseObject(result);
}
}else{
if (StringUtils.isNotBlank(result)){
obj = (T) JSON.parseObject(result, clazz);
}
}
}else{
throw new RuntimeException("Not support contentType "+ ct.toString());
}
}finally{
EntityUtils.consume(entity);
}
}
} catch (Exception e) {
long endTime = System.currentTimeMillis();
logger.warn("{}|{}|{}|{}|1|{}", post.getURI(), status, (endTime-startTime), inputSize, lbrqid);
throw new HttpException("",e);
}finally {
long endTime = System.currentTimeMillis();
if (ignoreResult){
logger.info("cost={}ms,status={},url={},params={}", endTime - startTime,status, post.getURI(),params);
}else{
if(limitResult <= || StringUtils.defaultString(result, "").length() <= limitResult){
logger.info("cost={}ms,status={},url={},params={},result={},x_ca_requestid={}", endTime - startTime,status,
post.getURI(),params,result,x_ca_requestid);
}else{
result = result.substring(, limitResult);
logger.info("cost={}ms,status={},url={},params={},result={},x_ca_requestid={}", endTime - startTime,status,
post.getURI(),params,result,x_ca_requestid);
}
}
logger.warn("{}|{}|{}|{}|0|{}", post.getURI(), status, (endTime-startTime), inputSize,lbrqid);
}
return obj;
} public PostRequest setReadTimeOut(int readTimeOut){
if (readTimeOut>) {
this.readTimeOut = readTimeOut;
}
return this;
} public PostRequest setConnectTimeOut(int connectTimeOut){
if (connectTimeOut>) {
this.connectTimeOut = connectTimeOut;
}
return this;
} public PostRequest setWaitTimeOut(int waitTimeOut){
if (waitTimeOut>) {
this.waitTimeOut = waitTimeOut;
}
return this;
} }

红色部分代码一直空指针,然而自己都日志都打印出来了,入参不是空的啊。。。

想了半天,在本地调试,最后发现,是post 为空了。。 自己代码还没有new 就直接去使用了。

空指针,要么是参数问题,要么是方法里面有其他调用的参数为空。。 一下午的时间,解决了一个小问题,感觉好浪费时间。

之后打包 :mvn deploy -e  可以了。

一次升级jar包遇到的空指针异常的更多相关文章

  1. Log4j2升级jar包冲突问题

    升级Log4j2后日志提示jar包冲突: SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar ...

  2. weblogic解决jar包冲突

    前言 在项目中利用POI开发excel.word的导入导出功能,而POI在解析xlsx及docx两种高版本文档时需要依赖xmlbeans包,但weblogic容器中提供了低版本的xmlbeans,从而 ...

  3. struts2.3.16所需的基本的jar包---------SSH升级包不是整体全部都升级的

    struts2.3.16所需的基本的jar包   jar包放多了就报Exception什么Unable to load....上网搜了半天也没有能解决的 下面所说的jar包放到WEB-INF/lib以 ...

  4. 主机ssh升级到6.7以上版本后,使用jsch jar包ssh连接不上报Algorithm negotiation fail问题的解决办法

    ssh连接问题是由于主机ssh中缺少与jsch jar包匹配的加密算法导致,jsch jar包的默认加密算法貌似是diffie-hellman-group-exchange-sha1. 在目标主机ss ...

  5. idea升级maven工程jar包版本和解决jar包冲突

    原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...

  6. Android 升级ADT到22第三方Jar包导致的ClassNotFoundException和NoClassDefFoundError异常解决

    在使用异步载入框架Android-Universal-Image-Loader的Jar包的时候遇到错误: java.lang.NoClassDefFoundError:com.nostra13.uni ...

  7. springBoot项目不重新上传jar包,增量升级步骤

    1.把源jar包cp到一个空文件夹里,然后把该jar包解压 jar -xf www.itxm.cn-0.0.1-SNAPSHOT.jar 2.进入BOOT-INF文件夹,找到class文件夹,把要升级 ...

  8. Maven工程引入jar包

    Maven项目引入jar包的方法 法一.手动导入:项目右键—>Build Path—>Configure Build Path—>选中Libraries—>点击Add Exte ...

  9. android studio 使用gradle 导出jar包,并打包assets目录

    警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...

随机推荐

  1. Mybatis框架进行批量导入和删除有三种方式

    首先创建一个数据库 CREATE TABLE user (   id varchar(32) CHARACTER SET utf8 NOT NULL,   name varchar(50) CHARA ...

  2. jmeter对接口测试入参进行MD5加密的5种方式

    在使用jmeter做测试的过程中,经常需要对请求的入参进行加密,下面列举几种常用的方法,以登录请求密码需要MD5加密为例. 虽然可以先把参数化的明文密码都先md5加密,而不是在登录前先执行加密,但是实 ...

  3. Centos7.x for aarch64 下载地址

    ARM64架构系统 CentOS7镜像下载源 http://archive.kernel.org/centos-vault/altarch/ 例如:centos7.5 http://archive.k ...

  4. wordpress调用文章摘要,若无摘要则自动截取文章内容字数做为摘要

    以下是调用指定分类文章列表的一个方法,作者如果有填写文章摘要则直接调用摘要:如果文章摘要忘记写了则自动截取文章内容字数做为摘要.这个方法也适用于调用description标签 <ul> & ...

  5. iframe跨域修改子页面内容或样式

    哈哈 当然不能啦 要是能修改百度logo早就是我的头像了

  6. Java中对象的比较(学习笔记)

    1)详细说明对象的比较方式有哪些? ①对象引用的比较("= ="运算符) "= ="是将对象的引用进行比较,实质是比较两个引用变量是否引用同一个对象.注意的点: ...

  7. runtime - 消息发送(objc_msgSend)

    http://www.jianshu.com/p/95c8cb186673 在OC中,我们对方法的调用都会被转换成内部的消息发送执行对objc_msgSend方法的调用,掌握好消息发送,可以让我们在编 ...

  8. React Virtual DOM Explained in Simple English

    If you are using React or learning React, you must have heard of the term “Virtual DOM”. Now what is ...

  9. 对MVVM的理解

    MVVM是Model-view-ViewMoudel的缩写 Model代表数据类型,也可以在Model中定义数据修改和操作的业务逻辑: View代表UI组件,负责将数据模型转化为UI展现出来: Vie ...

  10. Bounding Box回归

    简介 Bounding Box非常重要,在rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到今年cvpr最新的yolo9000都会用到. 先看图 对于上图 ...