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

  1. package com.zhuanche.http;
  2.  
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.google.common.collect.Maps;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.apache.http.*;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.entity.UrlEncodedFormEntity;
  10. import org.apache.http.client.methods.HttpPost;
  11. import org.apache.http.entity.ContentType;
  12. import org.apache.http.entity.StringEntity;
  13. import org.apache.http.entity.mime.HttpMultipartMode;
  14. import org.apache.http.entity.mime.MultipartEntityBuilder;
  15. import org.apache.http.message.BasicNameValuePair;
  16. import org.apache.http.util.EntityUtils;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.slf4j.MDC;
  20.  
  21. import java.io.File;
  22. import java.io.InputStream;
  23. import java.nio.charset.Charset;
  24. import java.util.*;
  25.  
  26. import static com.sq.common.okhttp.constants.OkHttpConfig.DEFAULT_HEADER_ACCEPT_ENCODING;
  27. import static com.sq.common.okhttp.constants.OkHttpConfig.DEFAULT_HEADER_ACCEPT_ENCODING_VALUE;
  28. import static com.sq.common.okhttp.constants.OkHttpConfig.DEFAULT_HEADER_REQLOGIGNORE;
  29.  
  30. /**
  31. * 处理post请求
  32. * @author huiwu
  33. */
  34. public final class PostRequest extends Request{
  35.  
  36. private static final Logger logger = LoggerFactory.getLogger(PostRequest.class);
  37.  
  38. private HttpPost post = null;
  39.  
  40. private HttpClient client = null;
  41.  
  42. private HttpEntity httpEntity = null;
  43.  
  44. private final static String TRACEKEY = "X-Request-Id";
  45.  
  46. private final static String TRACEID = "traceId";
  47.  
  48. private static final String CHARNULL = "";
  49.  
  50. private final List<NameValuePair> params = new ArrayList<NameValuePair>();
  51.  
  52. private static final String DEFAULTCHARSET = "UTF-8";
  53.  
  54. private String charset = DEFAULTCHARSET;
  55.  
  56. public PostRequest(HttpClient client, String url) {
  57. this.client = client;
    this.addHeaders(null);
  58. post = new HttpPost(url);
  59. }
  60.  
  61. public PostRequest(HttpClient httpClient, String url,
  62. String charset) {
  63. this(httpClient,url);
  64. this.charset = charset;
  65. this.addHeaders(null);
  66. }
  67.  
  68. public PostRequest addHeader(String name, Object value) {
  69. if (value == null) {
  70. return this;
  71. }
  72. if(StringUtils.isNotEmpty(name)){
  73. post.addHeader(name, String.valueOf(value));
  74. }
  75. return this;
  76. }
  77.  
  78. public PostRequest addHeaders(Map<String,Object> headers){
  79. //nginx统一是TRACE_KEY,项目里面有些是traceId 所以做的兼容
  80. logger.info("tracekey:" + TRACEKEY + ",value:" + MDC.get(TRACEKEY));
  81. addHeader(DEFAULT_HEADER_REQLOGIGNORE, String.valueOf(false));
  82. addHeader(DEFAULT_HEADER_ACCEPT_ENCODING, DEFAULT_HEADER_ACCEPT_ENCODING_VALUE);
  83. if(MDC.get(TRACEKEY) != null){
  84. addHeader(TRACEKEY,MDC.get(TRACEKEY));
  85. }else if(MDC.get(TRACEID) != null){
  86. addHeader(TRACEKEY,MDC.get(TRACEID));
  87. }else {
  88. addHeader(TRACEKEY,CHARNULL);
  89. }
  90.  
  91. if (headers==null||headers.isEmpty()) {
  92. return this;
  93. }
  94. Set<String> keySets = headers.keySet();
  95. Iterator<String> it = keySets.iterator();
  96. while (it.hasNext()){
  97. String key = it.next();
  98. addHeader(key, headers.get(key));
  99. }
  100. return this;
  101. }
  102.  
  103. public PostRequest addParam(String name, Object value) {
  104. if (value == null) {
  105. return this;
  106. }
  107. params.add(new BasicNameValuePair(name, String.valueOf(value)));
  108. return this;
  109. }
  110. public PostRequest addParams(Map<String,Object> map) {
  111. if (map == null||map.isEmpty()) {
  112. return this;
  113. }
  114. Set<String> keys = map.keySet();
  115. Iterator<String> it = keys.iterator();
  116. while (it.hasNext()){
  117. String paramName = it.next();
  118. addParam(paramName,map.get(paramName));
  119. }
  120. return this;
  121. }
  122.  
  123. /**
  124. * 设置body后,通过addParam方法添加的参数将不会设置到请求中
  125. * @param body
  126. * @return
  127. */
  128. public PostRequest setBody(String body) {
  129. return setBody(body,ContentType.TEXT_PLAIN);
  130. }
  131.  
  132. /**
  133. * 设置body后,通过addParam方法添加的参数将不会设置到请求中
  134. * @param body
  135. * @return
  136. */
  137. public PostRequest setBody(String body,ContentType contentType) {
  138. try {
  139. if (body==null) {
  140. return this;
  141. }
  142. httpEntity = new StringEntity(body,charset);
  143. } catch (Exception e) {
  144. logger.error("set String body error ", e);
  145. }
  146. return this;
  147. }
  148.  
  149. public PostRequest setLimitResult(int limitResult) {
  150. this.limitResult = limitResult;
  151. return this;
  152. }
  153.  
  154. /**
  155. * 添加文件参数,一个POST请求添加一个文件参数
  156. * @param name 上传文件的参数名
  157. * @param file
  158. * @return
  159. */
  160. public Request addFile(String name, File file) {
  161. try {
  162. addFile(name, file, ContentType.DEFAULT_BINARY);
  163. } catch (Exception e) {
  164. logger.error("set File body error ", e);
  165. }
  166. return this;
  167. }
  168.  
  169. /**
  170. * 添加文件参数,一个POST请求添加一个文件参数
  171. * @param name 上传文件的参数名
  172. * @param file
  173. * @param contentType 默认为 application/octet-stream
  174. * @return
  175. */
  176. public Request addFile(String name, File file,ContentType contentType) {
  177. try {
  178. if (contentType==null) {
  179. contentType = ContentType.DEFAULT_BINARY;
  180. }
  181. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  182. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  183. builder.addBinaryBody(name, file, contentType,file != null ? file.getName() : null);
  184. builder.setCharset(Charset.forName(charset));
  185. if (params!=null&&!params.isEmpty()) {
  186. for (NameValuePair nv : params) {
  187. builder.addTextBody(nv.getName(),nv.getValue());
  188. }
  189. }
  190. httpEntity = builder.build();
  191. } catch (Exception e) {
  192. logger.error("set File error ", e);
  193. }
  194. return this;
  195. }
  196.  
  197. public String execute()throws HttpException {
  198. return exc(String.class);
  199. }
  200.  
  201. @Override
  202. public JSONObject executeToJson()throws HttpException {
  203. return exc(JSONObject.class);
  204. }
  205.  
  206. public <T>T executeToObject(Class<T> clazz)throws HttpException{
  207. return exc(clazz);
  208. }
  209.  
  210. public PostRequest setIgnoreResult(boolean ignoreResult) {
  211. this.ignoreResult = ignoreResult;
  212. return this;
  213. }
  214.  
  215. @SuppressWarnings("unchecked")
  216. private <T> T exc(Class<T> clazz) throws HttpException {
  217. T obj = null;
  218. int status = ;
  219. String result = null;
  220. Integer inputSize = ;
  221. String lbrqid = "";
  222. String x_ca_requestid = "";
  223. long startTime = System.currentTimeMillis();
  224. try {
  225. if (httpEntity==null) {
  226. httpEntity = new UrlEncodedFormEntity(params,charset);
  227. }
  228. post.setEntity(httpEntity);
  229. post.setConfig(getRequestConfig());
  230. HttpResponse response = client.execute(post);
  231. HttpEntity entity = response.getEntity();
  232. try {
  233. // traceid唯一ID
  234. Header[] headers = response.getHeaders("lbrqid");
  235. if (null != headers && headers.length > ) {
  236. lbrqid = headers[].getValue();
  237. }
  238.  
  239. // 阿里接口响应ID
  240. Header[] headers2 = response.getHeaders("X-Ca-Request-Id");
  241. if (null != headers2 && headers2.length > ) {
  242. x_ca_requestid = headers2[].getValue();
  243. }
  244. if(StringUtils.isEmpty(lbrqid)){
  245. lbrqid = x_ca_requestid;
  246. }
  247. // 获取字节大小
  248. InputStream content = entity.getContent();
  249. inputSize = content.available();
  250. } catch (Exception e) {
  251. logger.error("获取头信息异常.", e);
  252. }
  253. status = response.getStatusLine().getStatusCode();
  254. if (entity!=null) {
  255. try {
  256. ContentType ct = ContentType.get(entity);
  257. result = EntityUtils.toString(entity, charset);
  258. if (clazz==null||clazz == String.class){
  259. if (StringUtils.isNotBlank(result)){
  260. obj = (T) result;
  261. }
  262. }else if (ContentType.APPLICATION_JSON.getMimeType().equals(ct.getMimeType())){
  263. if (clazz == JSONObject.class){
  264. if (StringUtils.isNotBlank(result)){
  265. obj = (T) JSON.parseObject(result);
  266. }
  267. }else{
  268. if (StringUtils.isNotBlank(result)){
  269. obj = (T) JSON.parseObject(result, clazz);
  270. }
  271. }
  272. }else{
  273. throw new RuntimeException("Not support contentType "+ ct.toString());
  274. }
  275. }finally{
  276. EntityUtils.consume(entity);
  277. }
  278. }
  279. } catch (Exception e) {
  280. long endTime = System.currentTimeMillis();
  281. logger.warn("{}|{}|{}|{}|1|{}", post.getURI(), status, (endTime-startTime), inputSize, lbrqid);
  282. throw new HttpException("",e);
  283. }finally {
  284. long endTime = System.currentTimeMillis();
  285. if (ignoreResult){
  286. logger.info("cost={}ms,status={},url={},params={}", endTime - startTime,status, post.getURI(),params);
  287. }else{
  288. if(limitResult <= || StringUtils.defaultString(result, "").length() <= limitResult){
  289. logger.info("cost={}ms,status={},url={},params={},result={},x_ca_requestid={}", endTime - startTime,status,
  290. post.getURI(),params,result,x_ca_requestid);
  291. }else{
  292. result = result.substring(, limitResult);
  293. logger.info("cost={}ms,status={},url={},params={},result={},x_ca_requestid={}", endTime - startTime,status,
  294. post.getURI(),params,result,x_ca_requestid);
  295. }
  296. }
  297. logger.warn("{}|{}|{}|{}|0|{}", post.getURI(), status, (endTime-startTime), inputSize,lbrqid);
  298. }
  299. return obj;
  300. }
  301.  
  302. public PostRequest setReadTimeOut(int readTimeOut){
  303. if (readTimeOut>) {
  304. this.readTimeOut = readTimeOut;
  305. }
  306. return this;
  307. }
  308.  
  309. public PostRequest setConnectTimeOut(int connectTimeOut){
  310. if (connectTimeOut>) {
  311. this.connectTimeOut = connectTimeOut;
  312. }
  313. return this;
  314. }
  315.  
  316. public PostRequest setWaitTimeOut(int waitTimeOut){
  317. if (waitTimeOut>) {
  318. this.waitTimeOut = waitTimeOut;
  319. }
  320. return this;
  321. }
  322.  
  323. }

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

想了半天,在本地调试,最后发现,是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. Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest

    Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) 把commons-ileu ...

  2. Maven 学习(一)-Maven 使用入门

    http://www.cnblogs.com/xdp-gacl/p/3498271.html http://www.cnblogs.com/xdp-gacl/p/4240930.html 一.Mave ...

  3. react native iOS真机调试-联网问题与js严格模式

    rn:strict mode does not allow function declarations in a lexically nested statement https://blog.csd ...

  4. MongoDB mongoimport 从csv导入数据指定字段类型

    mongoimport:指定字段的类型,防止将数字型的字符串导入成数值类型 1.正常模式导入 mongoimport -d idpad_zl -c trs_action_dzwl_zm --type ...

  5. 【题解】洛谷 P2725 邮票 Stamps

    目录 题目 思路 \(Code\) 题目 P2725 邮票 Stamps 思路 \(\texttt{dp}\).\(\texttt{dp[i]}\)表示拼出邮资\(i\)最少需要几张邮票. 状态转移方 ...

  6. ffmpeg结合SDL编写播放器(三)

    接下来是解析影片的帧 /*** project.c ***/ #include<stdio.h> #include<libavcodec/avcodec.h> #include ...

  7. 基于centos搭建微信小程序服务,配置及数据库等

    基于centos搭建小程序, ps:请提前20天准备将域名备案,申请ssl证书 实验上机地址:https://cloud.tencent.com/developer/labs/lab/10004 准备 ...

  8. 转载:关于思科交换机、路由器如何关闭telnet 开启ssh服务

    等保测评要求: 必须关闭telnet服务,开启ssh服务 即用ssh方式登录网络设备,而不允许用telnet. 输入密码.en 再次输入密码.sh run 这些常规动作就不再赘述. 1.关闭telne ...

  9. 拼多多面试真题:如何用 Redis 统计独立用户访问量!

    阅读本文大概需要 2.8 分钟. 作者:沙茶敏碎碎念 众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作 3 年的开发,稍微优秀一点的,都给到 30K 的 Offer. 当然,拼 ...

  10. leetcode 85. 最大矩形

    题目描述: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 思路分析: 这题是之前那道最大正方形的进阶,同样是利用dp来求解.通过逐行去计算最大矩形,即优化的 ...