一次升级jar包遇到的空指针异常
今天自己在升级公司的一个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包遇到的空指针异常的更多相关文章
- Log4j2升级jar包冲突问题
升级Log4j2后日志提示jar包冲突: SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar ...
- weblogic解决jar包冲突
前言 在项目中利用POI开发excel.word的导入导出功能,而POI在解析xlsx及docx两种高版本文档时需要依赖xmlbeans包,但weblogic容器中提供了低版本的xmlbeans,从而 ...
- struts2.3.16所需的基本的jar包---------SSH升级包不是整体全部都升级的
struts2.3.16所需的基本的jar包 jar包放多了就报Exception什么Unable to load....上网搜了半天也没有能解决的 下面所说的jar包放到WEB-INF/lib以 ...
- 主机ssh升级到6.7以上版本后,使用jsch jar包ssh连接不上报Algorithm negotiation fail问题的解决办法
ssh连接问题是由于主机ssh中缺少与jsch jar包匹配的加密算法导致,jsch jar包的默认加密算法貌似是diffie-hellman-group-exchange-sha1. 在目标主机ss ...
- idea升级maven工程jar包版本和解决jar包冲突
原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...
- Android 升级ADT到22第三方Jar包导致的ClassNotFoundException和NoClassDefFoundError异常解决
在使用异步载入框架Android-Universal-Image-Loader的Jar包的时候遇到错误: java.lang.NoClassDefFoundError:com.nostra13.uni ...
- springBoot项目不重新上传jar包,增量升级步骤
1.把源jar包cp到一个空文件夹里,然后把该jar包解压 jar -xf www.itxm.cn-0.0.1-SNAPSHOT.jar 2.进入BOOT-INF文件夹,找到class文件夹,把要升级 ...
- Maven工程引入jar包
Maven项目引入jar包的方法 法一.手动导入:项目右键—>Build Path—>Configure Build Path—>选中Libraries—>点击Add Exte ...
- android studio 使用gradle 导出jar包,并打包assets目录
警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...
随机推荐
- 团队项目评审&课程学习总结
一:实验名称:团队项目评审&课程学习总结 二:实验目的与要求 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. 三:实验步骤 任务一:按照团队项目结对评审名单,由项目组扮演乙方,结 ...
- 用户体验报告(Echo)
班级:软件工程1916|W 作业:项目Beta冲刺(团队) 团队名称:Echo 团队博客汇总 队员学号 队员姓名 个人博客地址 备注 221600136 张至锋 https://www.cnblogs ...
- python基础语法6 名称空间与作用域
目录: 1.函数对象 2.函数嵌套 3.名称空间 4.作用域 函数是第一类对象 1.函数名是可以被引用: def index(): print('from index') a = index a() ...
- NSFileHandle类和NSFileManager,追加数据的操作
NSFileHandle类主要对文件内容进行读取和写入操作 NSFileManager类主要对文件的操作(删除.修改.移动.复制等等) 常用处理方法 + (id)fileHandleForReadin ...
- UI与数据的绑定
核心是数据变化跟踪与UI更新的问题 概念整理: 供业务使用的叫数据: 供UI使用的叫状态: UI的变化能被监听到: 数据的变化能实时反映到UI上: 数据变化—>拦截—〉UI状态重置—>UI ...
- hihocoder#1046: K个串
[传送门] 这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$r$.然后当前线段树/树状数组维护区间左端点为$[1,r)$时对应的 ...
- python-随机生成验证码实例
需求:随机生成验证码, 思路: 1.生成一个随机数,65-90 2.数字转化为字母:chr(数字) #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...
- linux学习15 Linux系统用户和组全面讲解
一.用户,组和权限管理 1.多用户(Multi-tasks),多任务(Multi-Users).对计算机而言,每一个使用者就是一个用户. 2.每个使用者: a.用户标识,密码: 认证(Authenti ...
- Thanos prometheus 集群以及多租户解决方案docker-compose 试用(一)
prometheus 是一个非常不多的metrics 监控解决方案,但是对于ha 以及多租户的处理并不是很好,当前有好多解决方案 cortex Thanos prometheus+ influxdb ...
- cpu的发现
system.cpu.discovery 检测到的CPU/CPU内核列表.用于低级发现 返回的cpu从0开始编号,其他关于cpu的监控项就可以使用cpu的id进行单个cpu的资源监控