Hexo

今天又是充满希望的一天

最近在做一个转发功能,zuul + ribbon + resttemplate 进行路由、负载、转发的功能

基本准备就绪,在微信自动登陆那遇到了一个坑,ribbon 系统用resttemplate 转发A系统的资源,在微信自动登陆的地方,A系统重定向到微信的地址,类似下面的代码

1
redirect: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3290f3d5****&redirect_uri=http://***.com/weixin/wxAuthRedirect?redirectUrl=http%3A%2F%2F192.168.10.116%3A8081%2Finternal%2Fpage%2Fuser%2Flogin_wx&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect

结果resttemplate 自动重定向到本地的地址,如下所示:

1
http://192.168.10.116:**/connect/oauth2/authorize**

仔细思考了下,大概就是resttemplate 的重定向问题,查了查资料,找到一个类HttpComponentsClientHttpRequestFactory,RestTemplate初始化提供了这个类的参数

1
2
3
4
5
6
7
8
9
10
/**
* Create a new instance of the {@link RestTemplate} based on the given {@link ClientHttpRequestFactory}.
* @param requestFactory HTTP request factory to use
* @see org.springframework.http.client.SimpleClientHttpRequestFactory
* @see org.springframework.http.client.HttpComponentsClientHttpRequestFactory
*/
public RestTemplate(ClientHttpRequestFactory requestFactory) {
this();
setRequestFactory(requestFactory);
}

HttpComponentsClientHttpRequestFactory继承自ClientHttpRequestFactory,这个类的子类有HttpComponentsClientHttpRequestFactory和SimpleClientHttpRequestFactory

找到SimpleClientHttpRequestFactory,有如下方法:

第一种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Template method for preparing the given {@link HttpURLConnection}.
* <p>The default implementation prepares the connection for input and output, and sets the HTTP method.
* @param connection the connection to prepare
* @param httpMethod the HTTP request method ({@code GET}, {@code POST}, etc.)
* @throws IOException in case of I/O errors
*/
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
if (this.connectTimeout >= 0) {
connection.setConnectTimeout(this.connectTimeout);
}
if (this.readTimeout >= 0) {
connection.setReadTimeout(this.readTimeout);
}

connection.setDoInput(true);

if ("GET".equals(httpMethod)) {
connection.setInstanceFollowRedirects(true);
}
else {
connection.setInstanceFollowRedirects(false);
}

if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) ||
"PATCH".equals(httpMethod) || "DELETE".equals(httpMethod)) {
connection.setDoOutput(true);
}
else {
connection.setDoOutput(false);
}

connection.setRequestMethod(httpMethod);
}

可以看到setInstanceFollowRedirects,get请求是可以重定向的,其他方法禁止了重定向,于是建个SimpleClientHttpRequestFactory的子类,禁用重定向。

于是乎 NoRedirectClientHttpRequestFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.IOException;
import java.net.HttpURLConnection;

import org.springframework.http.client.SimpleClientHttpRequestFactory;

public class NoRedirectClientHttpRequestFactory extends SimpleClientHttpRequestFactory {

@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
// TODO Auto-generated method stub
super.prepareConnection(connection, httpMethod);
// 禁止自动重定向
connection.setFollowRedirects(false);
}
}
1
2
NoRedirectClientHttpRequestFactory httpRequestFactory = new NoRedirectClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);

接着,似乎更换ClientHttpRequestFactory并不合心意,还是要使用HttpComponentsClientHttpRequestFactory来实现,HttpComponentsClientHttpRequestFactory是可以自定义HttpClient的,于是查到了HttpClient头上,HttpClient是可以设置Redirect的,

第二种方式:

1
2
3
4
5
HttpClient httpClient = HttpClientBuilder.create()
.setRedirectStrategy(new LaxRedirectStrategy())
.build();
httpRequestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);

默认提供了两个类,DefaultRedirectStrategy和LaxRedirectStrategy,LaxRedirectStrategy继承自DefaultRedirectStrategy

DefaultRedirectStrategy.java

1
2
3
4
5
6
7
/**
* Redirectable methods.
*/
private static final String[] REDIRECT_METHODS = new String[] {
HttpGet.METHOD_NAME,
HttpHead.METHOD_NAME
};

LaxRedirectStrategy.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/

package org.apache.http.impl.client;

import org.apache.http.annotation.Contract;
import org.apache.http.annotation.ThreadingBehavior;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpPost;

/**
* Lax {@link org.apache.http.client.RedirectStrategy} implementation
* that automatically redirects all HEAD, GET, POST, and DELETE requests.
* This strategy relaxes restrictions on automatic redirection of
* POST methods imposed by the HTTP specification.
*
* @since 4.2
*/
@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class LaxRedirectStrategy extends DefaultRedirectStrategy {

public static final LaxRedirectStrategy INSTANCE = new LaxRedirectStrategy();

/**
* Redirectable methods.
*/
private static final String[] REDIRECT_METHODS = new String[] {
HttpGet.METHOD_NAME,
HttpPost.METHOD_NAME,
HttpHead.METHOD_NAME,
HttpDelete.METHOD_NAME
};

@Override
protected boolean isRedirectable(final String method) {
for (final String m: REDIRECT_METHODS) {
if (m.equalsIgnoreCase(method)) {
return true;
}
}
return false;
}

}

这就很清晰了,copy一份LaxRedirectStrategy的代码,改写掉REDIRECT_METHODS中的定义方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
	import org.apache.http.annotation.Contract;
import org.apache.http.annotation.ThreadingBehavior;
import org.apache.http.impl.client.DefaultRedirectStrategy;

/**
*
* @ClassName: MyRedirectStrategy
* @Description: TODO
* @author thinklight
* @date 2018年4月20日 下午2:47:29
*
*/
@Contract(threading = ThreadingBehavior.IMMUTABLE)
public class MyRedirectStrategy extends DefaultRedirectStrategy {

public static final MyRedirectStrategy INSTANCE = new MyRedirectStrategy();

/**
* Redirectable methods.
*/
private static final String[] REDIRECT_METHODS = new String[] {};

@Override
protected boolean isRedirectable(final String method) {
for (final String m: REDIRECT_METHODS) {
if (m.equalsIgnoreCase(method)) {
return true;
}
}
return false;
}
}

ribbon+微信各种重定向问题,解决了。

第三种方式:

自己蠢了,今天因为cookie的问题发现了简单的方式

1
HttpClient httpClient = HttpClientBuilder.create().disableCookieManagement().disableRedirectHandling().build();

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Autowired
RestTemplate restTemplate;

@Bean
@LoadBalanced
RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
// NoRedirectClientHttpRequestFactory httpRequestFactory = new NoRedirectClientHttpRequestFactory();// 此类型不能使用httpClient
httpRequestFactory.setConnectionRequestTimeout(2000);
httpRequestFactory.setConnectTimeout(10000);
httpRequestFactory.setReadTimeout(7200000);
// HttpClient httpClient = HttpClientBuilder.create()
// .setRedirectStrategy(new MyRedirectStrategy())
// .build();      HttpClient httpClient = HttpClientBuilder.create().disableCookieManagement().disableRedirectHandling().build();
httpRequestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
logger.debug("指定字符编码为UTF-8,原编码为ISO-8859-1");
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
logger.debug("RestTemple默认能转换为application/json,转换追加text/plain类型");
restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());
return restTemplate;
}

 

重定向参考:https://www.dozer.cc/2014/05/disable-resttemplate-redirect.html

cookie参考:https://stackoverflow.com/questions/10175649/resttemplate-and-cookie

https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies

使用spring boot实现项目启动时的监听,

UDPListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class UDPListener implements ServletContextListener {

public static final int MAX_UDP_DATA_SIZE = 4096;
public static final int UDP_PORT = 26666;

@Override
public void contextInitialized(ServletContextEvent sce) {

System.out.println("========UDPListener Initialized=========");
try {
// 启动一个线程,监听UDP数据报
new Thread(new UDPProcess(UDP_PORT)).start();
} catch (Exception e) {
e.printStackTrace();
}

}

class UDPProcess implements Runnable {
DatagramSocket socket = null;

public UDPProcess(final int port) throws SocketException {
socket = new DatagramSocket(port);
}

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("=======UDPProcess======");
while (true) {
byte[] buffer = new byte[MAX_UDP_DATA_SIZE];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(packet);
new Thread(new Process(packet)).start();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

class Process implements Runnable {

public Process(DatagramPacket packet) throws UnsupportedEncodingException {
// TODO Auto-generated constructor stub
byte[] buffer = packet.getData();// 接收到的UDP信息,然后解码
String srt1 = new String(buffer,"GBK").trim();
String srt2 = new String(buffer, "UTF-8").trim();
String srt3 = new String(buffer,"ISO-8859-1").trim();
System.out.println("=======Process srt1 GBK======" + srt1);
System.out.println("=======Process srt2 UTF-8======" + srt2);
System.out.println("=======Process srt3 ISO-8859-1======" + srt3);
}

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("====Process run=====");
}

}

@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("========UDPListener Destroyed=========");
}

}

DemoApplication

1
2
3
4
5
6
7
8
@SpringBootApplication
@ServletComponentScan
public class DemoApplication {

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

@ServletComponentScan Servlet扫描,启动时把servlet、filter、listener自动扫描注入 UDP测试客户端(也可以用测试工具发送UDP包测试):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClientTest {

public static final String SERVER_HOSTNAME = "localhost";
// 服务器端口
public static final int SERVER_PORT = 26666;
// 本地发送端口
public static final int LOCAL_PORT = 8888;

public static void main(String[] args) {
try {
// 1,创建udp服务。通过DatagramSocket对象。
DatagramSocket socket = new DatagramSocket(LOCAL_PORT);
// 2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress
// address, int port)
byte[] buf = "你好,世界".getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(SERVER_HOSTNAME),
SERVER_PORT);
// 3,通过socket服务,将已有的数据包发送出去。通过send方法。
socket.send(dp);
// 4,关闭资源。
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

 
结果:

weex文档地址:

http://weex-project.io/cn/guide/index.html

weex的文档过于简单,加上js语法 & android & ios本身也有很多的问题,导致新接触weex,几乎步步是坑

在此记录一下weex的一些探索

一、初始化

按照官方的步骤走,

1
2
3
4
5
6
7
8
9
10
11
#安装node
...

#安装weex-toolkit
npm install weex-toolkit -g
#创建项目
weex create awesome-app
#开发
cd awesome-app
npm install
npm start

接着就遇到了语法问题,具体如下所示
https://segmentfault.com/q/1010000013417243?_ea=3379756

待续。。。

表名:parkUserCost
id:
patkId:
userId:
phone:
costVal:
适合特定条件下,对某些字段进行去重筛选。(比如限定抢购)

第一种,使用(first操作符。)first 会把数组的第一个元素取出,作为一个对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 第一种(可转java版本)
db.getCollection('parkUserCost').aggregate([
{"$match" : {
"$and" : [
// {"name" : "1640"} // 筛选条件
]
}
},
{"$group" : {
"_id" : "$phone",
"val" : {"$first" : "$costVal" },
}},
{"$group" : {
"_id" : {},
"totalVal" :{"$sum" : "$val"}
}}
])

第二种,使用$slice操作符。从数组的第几个开始,截取几个,保存到数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 第二种
db.getCollection('parkUserCost').aggregate([
{"$match" : {
"$and" : [
// {"name" : "1640"} // 筛选条件
]
}
},
{"$group" : {
"_id" : "$phone",
"val" : {"$push" : "$costVal" },
}},
{"$project" : {
"val" :{"$sum" :{"$slice" : ["$val", 0, 1 ] }}
}},
{"$group" : {
"_id" : {},
"totalVal" :{"$sum" : "$val"}
}}
])

第三种,使用$arrayElemAt,返回数组的第几个元素。序号的循环的,最后一个使用-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 第三种
db.getCollection('parkUserCost').aggregate([
{"$match" : {
"$and" : [
// {"name" : "1640"} // 筛选条件
]
}
},
{"$group" : {
"_id" : "$phone",
"val" : {"$push" : "$costVal" },
}},
{"$project" : {
"val" : { "$arrayElemAt" :[ "$val" , 0] }
}},
{"$group" : {
"_id" : {},
"totalVal" :{"$sum" : "$val"}
}}
])

若要表中的全部字段,可使用$$ROOT获取

1
2
3
4
5
6
7
8
9
10
11
12
13
db.getCollection('parkUserCost').aggregate([
{"$match" : {
"$and" : [
// {"name" : "1640"} // 筛选条件
]
}
},
{"$group" : {
"_id" : "$phone",
"item": {"$first": "$$ROOT"},
"val" : {"$first" : "$costVal" },
}},
])

http://www.runoob.com/mongodb/mongodb-tutorial.html

1、需求

由于项目一开始做的时候不甚完善,所有的网页没有路由功能,导致一些搜索结果在页面跳转之后,没有被记录下来,在页面跳转之后回退,得到的是页面最原始的结果,没有指定的搜索条件。最近项目的在完善这些小的细节,所以在此记录一下。

2、操作

由于项目的所有传参都是使用 ‘?’ 来标识的,而Backbone的路由是使用锚点 ‘/#’ 来的,为了兼容以前的做法,不得不去修改Backbone的源码,还好路由部分的源码不多

2.1 修改Backbone的源码,版本1.3.3

1)修改标识 ‘/#’ -> ‘?’

把源代码中的字符串中的’/#’修改为’?’,把单个的’/#’修改为’?’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
例:

var pathStripper = /#.*$/;

修改为:

var pathStripper = /\?.*$/;

例:

this.location.replace(rootPath + '#' + this.getPath());

修改为:

this.location.replace(rootPath + '?' + this.getPath());

注:字符串中的?需要\来转义,字符不需要
2)修改锚点的路由设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
_updateHash: function(location, fragment, replace) {

if (replace) {

var href = location.href.replace(/(javascript:|\?).*$/, '');

location.replace(href + '?' + fragment);

} else {

// Some browsers require that `hash` contains a leading #.

// location.hash = '?' + fragment;

var href = location.href.replace(/(javascript:|\?).*$/, '');

// window.history.pushState({}, 0, href + '?' + fragment);

window.history.replaceState({}, 0, href + '?' + fragment);

}

}

注:

location.hash是原始的修改参数方法,会替换url中’/#’以及后的所有内容

window.history.pushState可选目标方法,会增加一次历史记录,刷新页面

window.history.replaceState可选目标方法,会替换掉当前的页面记录,不刷新页面(目前选用方案)

2.2 写一个Util

写一个工具类用于Router的快速使用,和统一修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**

* RouterUtil.js

*/

var RouterUtil = (function() {

// Backbone Router with a custom parameter extractor

var Router = Backbone.Router.extend({

params : "",

routes : {

"*actions": "defaultRoute" // 匹配 http://example.com/#anything-here

},

defaultRoute : function(params) {

Router.params = params;

},

});

var routerUtil = {

web_router : null,

init(){

// 初始化

if(!routerUtil.web_router){

routerUtil.web_router = new Router;

Backbone.history.start();

}

},

getParam(cbFn){

routerUtil.init();

// 获取#之后的参数

if(cbFn){

cbFn(Router.params);

}

},

route(returnUrl, cbFn){

// 动态的调整 路由规则 例:topic/:pageno/:pagesize

routerUtil.web_router.route(returnUrl,"page", cbFn)

},

start(){

// 启用路由

if(!Backbone.History.started){

Backbone.history.start();

}

},

stop(){

// 关闭路由

if(Backbone.History.started){

Backbone.history.stop();

}

},

navigate(returnUrl){

/**

* 重构 ,路由导向

*/

//此处根据自己的需求去构建参数拼接

//returnUrl为'?'之后的内容

if(returnUrl){

}else{

returnUrl = "searchType=" + SearchBoxUtil.searchType + "&" + SearchBoxUtil.formData;

}

routerUtil.web_router.navigate(returnUrl, {

trigger: true

});

}

}

return routerUtil;

})();

2.3 使用

在js中引用的一些方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 页面的初始化

initPagi : function(){

RouterUtil.getParam(function(params){

if(!params){

params = "";

}

//处理参数

...

});

},

//查询函数

queryData : function(returnUrl,isInitSearchBox){

if(!returnUrl){

returnUrl = "";

}

if(isInitSearchBox){

//第一次初始化查询

}else{

//非第一次初始化查询

RouterUtil.navigate(returnUrl);

}

...

},

菜鸟一枚,随便弄弄的一点代码,有更好的方案请赐教

是这样的。preference -> general -> keys ,找到Organize Imports ,然后 在 “WHEN”里面 要选择 Editing JAVA SOURCE。  

这个是最重要的

findBugs错误英文翻译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
rule.findbugs.IMSE_DONT_CATCH_IMSE.name=不良实践 - 捕获可疑IllegalMonitorStateException
rule.findbugs.BX_BOXING_IMMEDIATELY_UNBOXED.name=性能 - 基本类型包装之后立刻解包
rule.findbugs.IJU_SETUP_NO_SUPER.name=使用错误 - TestCase定义的setUp没有调用super.setUp()
rule.findbugs.TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED.name=使用错误 - 某个值使用了注解限制类型,但是这个限制永远不会发生
rule.findbugs.TLW_TWO_LOCK_WAIT.name=多线程错误 - 等待两个被持有的锁
rule.findbugs.RV_01_TO_INT.name=使用错误 - 0至1的随机数被当做整数0
rule.findbugs.NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE.name=高危 - 参数必须非null但是标记为可为null
rule.findbugs.RV_ABSOLUTE_VALUE_OF_RANDOM_INT.name=使用错误 - 尝试计算32位随机整数的绝对值
rule.findbugs.EC_INCOMPATIBLE_ARRAY_COMPARE.name=使用错误 - 使用equals()比较不兼容的数组
rule.findbugs.UL_UNRELEASED_LOCK_EXCEPTION_PATH.name=多线程错误 - 方法没有在所有异常路径释放锁
rule.findbugs.SE_NONSTATIC_SERIALVERSIONID.name=不良实践 - serialVersionUID不是static的
rule.findbugs.UCF_USELESS_CONTROL_FLOW.name=高危 - 无用控制流
rule.findbugs.BC_IMPOSSIBLE_CAST.name=使用错误 - 不可能的转换
rule.findbugs.XSS_REQUEST_PARAMETER_TO_SEND_ERROR.name=安全风险 - servlet的反射导致跨站脚本漏洞
rule.findbugs.DM_NEW_FOR_GETCLASS.name=性能 - 仅为了获得一个方法就创建了一个对象
rule.findbugs.OBL_UNSATISFIED_OBLIGATION.name=试验 - 方法可能在清理流或资源时失败
rule.findbugs.UW_UNCOND_WAIT.name=多线程错误 - 无条件等待
rule.findbugs.DLS_DEAD_LOCAL_STORE_OF_NULL.name=高危 - 把null设置给不会用到的局部变量
rule.findbugs.NM_CLASS_NAMING_CONVENTION.name=类名应该以大写字母开头
rule.findbugs.RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN.name=使用错误 - 怀疑对两个布尔值的引用进行比较
rule.findbugs.MWN_MISMATCHED_NOTIFY.name=多线程错误- 不匹配的notify()
rule.findbugs.NM_VERY_CONFUSING.name=错误 - 非常容易迷惑的方法名
rule.findbugs.FI_NULLIFY_SUPER.name=不良实践 - 空Finalizer禁用了超类的finalizer
rule.findbugs.MTIA_SUSPECT_STRUTS_INSTANCE_FIELD.name=高危 - 继承了struts Action的类使用了实例变量
rule.findbugs.DM_STRING_CTOR.name=性能 - 方法调用了效率很低的new String(String)构造方法
rule.findbugs.STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE.name=多线程错误 - 调用静态DateFormat
rule.findbugs.NP_NULL_PARAM_DEREF_NONVIRTUAL.name=使用错误 - 非虚拟方法调用向非空参数传入了null
rule.findbugs.FI_EMPTY.name=不良实践 - 应该删除空的finalizer
rule.findbugs.CD_CIRCULAR_DEPENDENCY.name=试验 - 类间存在循环引用
rule.findbugs.EC_UNRELATED_TYPES.name=使用错误 - 使用equals()比较不同类型
rule.findbugs.EI_EXPOSE_STATIC_REP2.name=恶意代码漏洞 - 把可变对象保存到静态字段中可能会暴露内部静态状态
rule.findbugs.DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY.name=错误 - 对数组执行toString
rule.findbugs.SIC_INNER_SHOULD_BE_STATIC_ANON.name=性能 - 可以重构成一个静态内部类
rule.findbugs.STI_INTERRUPTED_ON_UNKNOWNTHREAD.name=错误 - 在thread实例上调用了静态Thread.interrupted()方法
rule.findbugs.CN_IDIOM_NO_SUPER_CALL.name=不良实践 - clone方法没有调用super.clone()
rule.findbugs.VA_FORMAT_STRING_BAD_ARGUMENT.name=错误用法 - 格式化字符串占位符与传入的参数不匹配
rule.findbugs.EQ_DOESNT_OVERRIDE_EQUALS.name=高危 - 类没有覆盖父类的equals方法
rule.findbugs.BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY.name=错误用法 - 集合转换为数组元素时发生的类型转换错误
rule.findbugs.SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION.name=不良实践 - 类是可扩展的,但是没有提供无参数的构造方法
rule.findbugs.TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK.name=错误用法 - 数值需要类型标示,但是却标记为未知
rule.findbugs.SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS.name=性能 - 可以筹够成一个静态内部类
rule.findbugs.EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS.name=不良实践 - equals检测不兼容的参数操作
rule.findbugs.RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED.name=错误用法 - 忽略了putIfAbsent的返回值,传递给putIfAbsent的值被重用
rule.findbugs.STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE.name=多线程错误 - 调用静态Calendar
rule.findbugs.MS_CANNOT_BE_FINAL.name=恶意代码漏洞 - 字段不是final的,不能防止恶意代码的攻击
rule.findbugs.IS_INCONSISTENT_SYNC.name=多线程错误 - 不一致的同步
rule.findbugs.SE_NO_SERIALVERSIONID.name=不良实践 - 类是可序列化的,但是没有定义serialVersionUID
rule.findbugs.EI_EXPOSE_REP2.name=恶意代码漏洞 - 可能暴露内部实现,通过与可变对象引用协作
rule.findbugs.NM_METHOD_CONSTRUCTOR_CONFUSION.name=错误用法 - 明显的方法/构造方法混淆
rule.findbugs.ICAST_INTEGER_MULTIPLY_CAST_TO_LONG.name=高危 - 整形乘法的结果转换为long型
rule.findbugs.QF_QUESTIONABLE_FOR_LOOP.name=高危 - for循环中存在复杂,微妙或者错误的自增
rule.findbugs.DLS_DEAD_STORE_OF_CLASS_LITERAL.name=错误用法 - 类中保存了无用字符
rule.findbugs.NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER.name=不良实践 - 使用了未来java版本中成为关键字的标识
rule.findbugs.BC_VACUOUS_INSTANCEOF.name=高危 - instanceof会一直返回true
rule.findbugs.INT_VACUOUS_BIT_OPERATION.name=高危 - 在整形上进行位操作时有一些位上出现空洞
rule.findbugs.NP_NULL_INSTANCEOF.name=错误用法 - 一个已知的null值被检测它是否是一个类型的实例
rule.findbugs.SIC_THREADLOCAL_DEADLY_EMBRACE.name=错误用法 - 非静态内部类和ThreadLocal的致命结合
rule.findbugs.EQ_UNUSUAL.name=高危 - 罕见的equals方法
rule.findbugs.IJU_NO_TESTS.name=错误用法 - TestCase没有任何测试
rule.findbugs.EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC.name=错误用法 - equals方法覆盖了父类的equals可能功能不符
rule.findbugs.XFB_XML_FACTORY_BYPASS.name=高危 - 方法直接调用了xml接口的一个具体实现
rule.findbugs.SWL_SLEEP_WITH_LOCK_HELD.name=多线程错误 - 方法在获得锁时调用了Thread.sleep()
rule.findbugs.CN_IDIOM.name=不良实践 - 类实现了Cloneable ,但是没有定义或使用clone方法
rule.findbugs.WA_AWAIT_NOT_IN_LOOP.name=多线程错误 - 未在循环中使用的Condition.await()
rule.findbugs.DM_FP_NUMBER_CTOR.name=性能 - 方法调用了低效的浮点书构造方法;应该使用静态的valueOf代替
rule.findbugs.SF_SWITCH_NO_DEFAULT.name=Switch语句中没有包含default
rule.findbugs.NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE.name=高危 - 调用返回返回值可能出现null值
rule.findbugs.NP_CLONE_COULD_RETURN_NULL.name=不良实践 - Clone方法可能返回null
rule.findbugs.MS_OOI_PKGPROTECT.name=恶意代码漏洞 - 属性应该从接口中移除并将访问权限设置为包保护
rule.findbugs.DM_BOXED_PRIMITIVE_TOSTRING.name=性能 - 方法使用了装箱的基本类型只为了调用toString
rule.findbugs.EQ_ABSTRACT_SELF.name=不良实践 - 抽象类定义了协变的equals方法
rule.findbugs.DM_STRING_TOSTRING.name=性能 - 方法调用了String的toString()方法
rule.findbugs.SE_METHOD_MUST_BE_PRIVATE.name=错误用法 - 方法必须是private的为了让序列化正常工作
rule.findbugs.DL_SYNCHRONIZATION_ON_BOOLEAN.name=多线程错误 - 在Boolean上使用同步可能导致死锁
rule.findbugs.UWF_UNWRITTEN_FIELD.name=错误用法 - 未赋值属性
rule.findbugs.IS2_INCONSISTENT_SYNC.name=多线程错误 - 不一致的同步
rule.findbugs.IM_AVERAGE_COMPUTATION_COULD_OVERFLOW.name=高危 - 计算平均值可能溢出
rule.findbugs.BIT_SIGNED_CHECK_HIGH_BIT.name=错误用法 - 检查位运算的符号
rule.findbugs.FL_MATH_USING_FLOAT_PRECISION.name=错误用法 - 方法进行数学运算时使用了浮点数的精度
rule.findbugs.WS_WRITEOBJECT_SYNC.name=多线程错误 - 类的writeObject()方法是同步的,但是没有做其他事情
rule.findbugs.RV_RETURN_VALUE_IGNORED.name=错误用法 - 方法忽略了返回值
rule.findbugs.SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE.name=安全风险 - 非常量的字符串传递给方法执行SQL语句
rule.findbugs.JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS.name=不良实践 - 不可变的类的属性应该是final
rule.findbugs.AM_CREATES_EMPTY_ZIP_FILE_ENTRY.name=不良实践 - 创建了一个空的zip文件的入口
rule.findbugs.DM_NEXTINT_VIA_NEXTDOUBLE.name=性能 - 使用Random的nextInt方法来获得一个随机整数,而不是nextDouble
rule.findbugs.UI_INHERITANCE_UNSAFE_GETRESOURCE.name=不良实践 - 如果类被扩展,GetResource的使用可能就是不安全的
rule.findbugs.SIO_SUPERFLUOUS_INSTANCEOF.name=错误用法 - 不必要的类型检测使用instanceof操作符
rule.findbugs.EQ_OTHER_NO_OBJECT.name=错误用法 - equals()方法定义,但是没有覆盖equals(Object)
rule.findbugs.USM_USELESS_ABSTRACT_METHOD.name=试验 - 抽象方法已经在实现的接口中定义了
rule.findbugs.MTIA_SUSPECT_SERVLET_INSTANCE_FIELD.name=高危 - 扩展Servlet的类使用了实例变量
rule.findbugs.DM_USELESS_THREAD.name=多线程错误 - 使用默认的空run方法创建了一个线程
rule.findbugs.ML_SYNC_ON_UPDATED_FIELD.name=多线程错误 - 方法在一个修改了的属性上进行了同步
rule.findbugs.CO_SELF_NO_OBJECT.name=不良实践 - 协变的compareTo()定义
rule.findbugs.BC_UNCONFIRMED_CAST.name=高危 - 未检查/未证实的类型转换
rule.findbugs.FI_FINALIZER_NULLS_FIELDS.name=不良实践 - Finalizer空属性
rule.findbugs.BIT_AND.name=错误用法 - 不兼容的位掩码(BIT_AND)
rule.findbugs.FE_FLOATING_POINT_EQUALITY.name=高危 - 测试浮点数相等
rule.findbugs.TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK.name=错误用法 - 值不要求有类型标示,但是标记为未知
rule.findbugs.NP_NULL_PARAM_DEREF.name=错误用法 - 方法调用把null传递给一个非null参数
rule.findbugs.FB_MISSING_EXPECTED_WARNING.name=试验 - findbugs丢失了期待或需要的警告
rule.findbugs.DMI_INVOKING_HASHCODE_ON_ARRAY.name=错误用法 - 在数组上调用了hashCode
rule.findbugs.QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT.name=错误用法 - 方法在布尔表达式中分配了boolean文字
rule.findbugs.SA_FIELD_SELF_COMPARISON.name=错误用法 - 属性自己与自己进行了比较
rule.findbugs.UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR.name=错误用法 - 父类的构造方法调用未初始化属性的方法
rule.findbugs.ES_COMPARING_PARAMETER_STRING_WITH_EQ.name=不良实践 - 比较字符串参数使用了 == 或 !=
rule.findbugs.INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE.name=错误用法 - 错误比较非负值与负数
rule.findbugs.INT_BAD_COMPARISON_WITH_SIGNED_BYTE.name=错误用法 - 错误比较带符号的byte
rule.findbugs.IO_APPENDING_TO_OBJECT_OUTPUT_STREAM.name=错误用法 - 尝试向一个对象输出流添加信息
rule.findbugs.FI_MISSING_SUPER_CALL.name=不良实践 - Finalizer没有调用父类的finalizer
rule.findbugs.VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED.name=错误用法 - 传递了多余实际使用的格式化字符串的参数
rule.findbugs.HE_EQUALS_USE_HASHCODE.name=不良实践 - 类定义了equals(),但使用了Object.hashCode()
rule.findbugs.IJU_BAD_SUITE_METHOD.name=错误用法 - TestCase声明了一个错误的suite方法
rule.findbugs.DMI_CONSTANT_DB_PASSWORD.name=安全风险 - 硬编码了数据库密码
rule.findbugs.REC_CATCH_EXCEPTION.name=高危 - 捕获了没有抛出的异常
rule.findbugs.PS_PUBLIC_SEMAPHORES.name=高危 - 类在公用接口中暴露了同步和信号
rule.findbugs.EC_UNRELATED_INTERFACES.name=错误用法 - 调用equals()比较不同的接口类型
rule.findbugs.UCF_USELESS_CONTROL_FLOW_NEXT_LINE.name=错误用法 - 执行到下一行的无用流程控制
rule.findbugs.LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE.name=试验 - OpenJDK中存在潜在的丢失logger的风险,因为弱引用
rule.findbugs.NP_UNWRITTEN_FIELD.name=错误用法 - 读取未初始化的属性
rule.findbugs.DMI_UNSUPPORTED_METHOD.name=高危 - 调用不支持的方法
rule.findbugs.RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE.name=高危 - 重复比较非空值和null
rule.findbugs.EC_BAD_ARRAY_COMPARE.name=错误用法 - 调用equals(),与==效果一样
rule.findbugs.EI_EXPOSE_REP.name=恶意代码漏洞 - 可能通过返回一个可变对象的引用暴露了内部实现
rule.findbugs.NP_DEREFERENCE_OF_READLINE_VALUE.name=高危 - 没有判断readLine()的结果是否为空
rule.findbugs.UPM_UNCALLED_PRIVATE_METHOD.name=性能 - 从未用到的私有方法
rule.findbugs.NP_NULL_ON_SOME_PATH.name=错误用法 - 可能出现空指针引用
rule.findbugs.NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT.name=不良实践 - equals()方法没有检测null参数
rule.findbugs.EC_NULL_ARG.name=错误用法 - 使用空参数调用equals()
rule.findbugs.SE_BAD_FIELD_STORE.name=不良实践 - 非序列化值保存在序列化类的实例变量中
rule.findbugs.VO_VOLATILE_REFERENCE_TO_ARRAY.name=多线程错误 - 数组的volatile引用不会把数组元素也当做volatile来引用
rule.findbugs.NP_SYNC_AND_NULL_CHECK_FIELD.name=多线程错误 - 同步和空值检测发生在同一个属性上
rule.findbugs.DM_EXIT.name=不良实践 - 方法调用了System.exit(...)
rule.findbugs.RC_REF_COMPARISON.name=不良实践 - 怀疑进行了引用比较
rule.findbugs.SE_NO_SUITABLE_CONSTRUCTOR.name=不良实践 - 类是可序列化的,但是父类没有定义无参数构造方法
rule.findbugs.DC_DOUBLECHECK.name=多线程错误 - 可能对属性进行了双重检测
rule.findbugs.DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT.name=错误用法 - 在int上调用了Double.longBitsToDouble
rule.findbugs.RpC_REPEATED_CONDITIONAL_TEST.name=错误用法 - 重复判断条件
rule.findbugs.WMI_WRONG_MAP_ITERATOR.name=性能 - keySet迭代是低效的,使用entrySet代替
rule.findbugs.DLS_DEAD_LOCAL_STORE.name=高危 - 未用的局部变量
rule.findbugs.INT_BAD_REM_BY_1.name=错误用法 - 整数剩余模1
rule.findbugs.RV_RETURN_VALUE_IGNORED_BAD_PRACTICE.name=不良实践 - 方法忽略异常返回值
rule.findbugs.SA_LOCAL_SELF_ASSIGNMENT.name=高危 - 局部变量的自我赋值
rule.findbugs.MS_SHOULD_BE_FINAL.name=恶意代码漏洞 - 属性不是final,但是应该设置成final
rule.findbugs.SIC_INNER_SHOULD_BE_STATIC.name=性能 - 应该是一个静态内部类
rule.findbugs.NP_GUARANTEED_DEREF.name=错误用法 - null值一定会被调用
rule.findbugs.SE_READ_RESOLVE_MUST_RETURN_OBJECT.name=不良实践 - readResolve方法必须返回Object
rule.findbugs.NP_LOAD_OF_KNOWN_NULL_VALUE.name=高危 - 加载了已知的null值
rule.findbugs.BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION.name=性能 - 基本数据被装箱又被拆箱
rule.findbugs.CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE.name=不良实践 - 类定义了clone()但没有实现Cloneable
rule.findbugs.CO_ABSTRACT_SELF.name=不良实践 - 抽象类定义了协变的compareTo()方法
rule.findbugs.BAC_BAD_APPLET_CONSTRUCTOR.name=试验 - 错误的Applet构造方法依赖未初始化的AppletStub
rule.findbugs.EQ_GETCLASS_AND_CLASS_CONSTANT.name=不良实践 - equals方法因为子类失败
rule.findbugs.DB_DUPLICATE_SWITCH_CLAUSES.name=高危 - 在两个switch语句中使用了相同的代码
rule.findbugs.DB_DUPLICATE_BRANCHES.name=高危 - 在两个分支中使用了相同的代码
rule.findbugs.UOE_USE_OBJECT_EQUALS.name=试验 - 在final类上调用了equals,但是没有覆盖Object的equals方法
rule.findbugs.FI_USELESS.name=不良实践 - Finalizer除了调用父类的finalizer以外什么也没做
rule.findbugs.NP_ALWAYS_NULL.name=错误用法 - 调用了null指针
rule.findbugs.DMI_VACUOUS_SELF_COLLECTION_CALL.name=错误用法 - 集合的调用不能被感知
rule.findbugs.DLS_DEAD_LOCAL_STORE_IN_RETURN.name=错误用法 - 返回语句中的无用的赋值
rule.findbugs.IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD.name=错误用法 - 在run方法中的JUnit检验不能报告给JUnit
rule.findbugs.DMI_EMPTY_DB_PASSWORD.name=安全风险 - 空的数据库密码
rule.findbugs.DM_BOOLEAN_CTOR.name=性能 - 方法调用了低效的Boolean构造方法;使用Boolean.valueOf(...)代替
rule.findbugs.BC_IMPOSSIBLE_DOWNCAST.name=错误用法 - 不可能转型
rule.findbugs.BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS.name=不良实践 - Equals方法不应该假设任何有关参数类型的事宜
rule.findbugs.RV_EXCEPTION_NOT_THROWN.name=错误用法 - 异常创建后就丢弃了,没有抛出
rule.findbugs.VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG.name=错误用法 - 基本类型数组传递给一个期待可变对象类型参数的方法
rule.findbugs.LI_LAZY_INIT_UPDATE_STATIC.name=多线程错误 - 错误的延迟初始化和更新静态属性
rule.findbugs.SA_FIELD_SELF_ASSIGNMENT.name=错误用法 - 属性自身赋值
rule.findbugs.EQ_ALWAYS_FALSE.name=错误用法 - equals方法一直返回false
rule.findbugs.DMI_RANDOM_USED_ONLY_ONCE.name=不良实践 - Random对象创建后只用了一次
rule.findbugs.NM_CLASS_NOT_EXCEPTION.name=不良实践 - Class没有继承Exception,虽然名字像一个异常
rule.findbugs.SA_LOCAL_DOUBLE_ASSIGNMENT.name=高危 - 给局部变量双重赋值
rule.findbugs.NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS.name=错误用法 - 方法调用传递null给非空参数 (ALL_TARGETS_DANGEROUS)
rule.findbugs.NP_TOSTRING_COULD_RETURN_NULL.name=不良实践 - toString方法可能返回null
rule.findbugs.BC_BAD_CAST_TO_ABSTRACT_COLLECTION.name=高危 - 转换成抽象集合值得怀疑
rule.findbugs.NM_LCASE_HASHCODE.name=类定义了hashcode(); 应该是hashCode()吧?
rule.findbugs.RU_INVOKE_RUN.name=多线程错误 - 在线程中调用了run(你的意思是再启动一次么?)
rule.findbugs.DMI_INVOKING_TOSTRING_ON_ARRAY.name=错误用法 - 调用了数组的toString
rule.findbugs.NM_METHOD_NAMING_CONVENTION.name=方法名应该以小写字母开头
rule.findbugs.RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES.name=高危 - 重复比较两个null值
rule.findbugs.SA_LOCAL_SELF_COMPUTATION.name=错误用法 - 对一个变量进行无意义的自我计算 (比如 x & x)
rule.findbugs.MS_MUTABLE_HASHTABLE.name=恶意代码漏洞 - 属性是可变的Hashtable
rule.findbugs.RV_DONT_JUST_NULL_CHECK_READLINE.name=高危 - 方法丢掉了readLine的结果,在检测它是非空之后。
rule.findbugs.ES_COMPARING_STRINGS_WITH_EQ.name=不良实践 - 使用== 或 !=比较String
rule.findbugs.DL_SYNCHRONIZATION_ON_SHARED_CONSTANT.name=多线程错误 - 同步内部String可能导致死锁
rule.findbugs.MF_METHOD_MASKS_FIELD.name=错误用法 - 方法定义了一个变量,与实例变量同名。
rule.findbugs.EQ_SELF_USE_OBJECT.name=错误用法 - 协变equals()方法定义,继承了Object.equals(Object)
rule.findbugs.ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND.name=错误用法 - int值转换成float,然后传递给Math.round
rule.findbugs.GC_UNRELATED_TYPES.name=错误用法 - 泛型参数与方法参数没有相互关系
rule.findbugs.BC_IMPOSSIBLE_INSTANCEOF.name=错误用法 - instanceof一直返回false
rule.findbugs.SBSC_USE_STRINGBUFFER_CONCATENATION.name=性能 - 方法在循环中使用+进行字符串拼接
rule.findbugs.ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL.name=错误用法 - int转换成double,然后传递给Math.ceil
rule.findbugs.UG_SYNC_SET_UNSYNC_GET.name=多线程错误 - 未同步的getter方法,同步的setter方法
rule.findbugs.RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION.name=错误用法 - 非法的正则表达式
rule.findbugs.SA_FIELD_SELF_COMPUTATION.name=错误用法 - 无意义的自我计算 (比如 x & x)
rule.findbugs.DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO_CORE_THREADS.name=错误用法 - 创建了没有任何线程的ScheduledThreadPoolExecutor
rule.findbugs.DMI_USELESS_SUBSTRING.name=高危 - 调用substring(0)会返回原值
rule.findbugs.IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD.name=高危 - 被继承的或外部的方法的模棱两可的调用
rule.findbugs.OS_OPEN_STREAM.name=不良实践 - 方法可能在关闭流时失败
rule.findbugs.HE_INHERITS_EQUALS_USE_HASHCODE.name=不良实践 - 类继承了equals(),但使用了Object.hashCode()
rule.findbugs.SE_NONFINAL_SERIALVERSIONID.name=不良实践 - serialVersionUID不是final的
rule.findbugs.EQ_SELF_NO_OBJECT.name=不良实践 - 协变equals()方法定义
rule.findbugs.SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH.name=由于switch语句导致的无用存储
rule.findbugs.SW_SWING_METHODS_INVOKED_IN_SWING_THREAD.name=不良实践 - 某些swing方法需要在swing线程中调用
rule.findbugs.VA_FORMAT_STRING_ILLEGAL.name=错误用法 - 非法的格式化字符串
rule.findbugs.DM_NUMBER_CTOR.name=性能 - 方法调用低效的数字构造方法;使用静态valueOf代替
rule.findbugs.RV_REM_OF_RANDOM_INT.name=高危 - 其余32位带符号随机整数
rule.findbugs.EQ_COMPARING_CLASS_NAMES.name=错误用法 - equals方法比较类名而不是比较类
rule.findbugs.ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD.name=高危 - 通过一个实例方法更新静态属性
rule.findbugs.TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED.name=错误用法 - 某个值使用了注解标记不会限制类型,但是这个限制是必须的
rule.findbugs.NS_NON_SHORT_CIRCUIT.name=高危 - 可疑的非短路逻辑
rule.findbugs.VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT.name=错误用法 - 格式化字符串没有前面的参数
rule.findbugs.SE_PRIVATE_READ_RESOLVE_NOT_INHERITED.name=高危 - 私有readResolve方法不是继承自父类
rule.findbugs.RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE.name=高危 - 对一个已知不是null的值重复进行空值判断
rule.findbugs.NM_LCASE_TOSTRING.name=类定义了tostring(); 应该是toString()吧?
rule.findbugs.HSC_HUGE_SHARED_STRING_CONSTANT.name=性能 - 巨大的字符串常量在多个类文件中间重复了
rule.findbugs.SE_TRANSIENT_FIELD_NOT_RESTORED.name=不良实践 - Transient属性没有再反序列化时被设置
rule.findbugs.JLM_JSR166_LOCK_MONITORENTER.name=多线程错误 - 在java.util.concurrent Lock上进行了同步
rule.findbugs.EQ_ALWAYS_TRUE.name=错误用法 - equals方法总是返回true
rule.findbugs.ISC_INSTANTIATE_STATIC_CLASS.name=不良实践 - 只提供静态方法的类不需要实例化
rule.findbugs.ICAST_IDIV_CAST_TO_DOUBLE.name=高危 - int相除的结果转换成double或float
rule.findbugs.RC_REF_COMPARISON_BAD_PRACTICE.name=错误用法 - 可疑的引用与常量的比较
rule.findbugs.FI_EXPLICIT_INVOCATION.name=不良实践 - 直接调用finalizer
rule.findbugs.ESync_EMPTY_SYNC.name=多线程错误 - 空的同步块
rule.findbugs.DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION.name=错误用法 - 不要使用removeAll清空集合
rule.findbugs.SE_BAD_FIELD.name=在序列化类中出现了非transient也非serializable的实例属性
rule.findbugs.NP_STORE_INTO_NONNULL_FIELD.name=错误用法 - 属性已经标记为NonNull,但是设置了一个null值
rule.findbugs.IT_NO_SUCH_ELEMENT.name=不良实践 - 迭代器的next()方法不能抛出NoSuchElementException
rule.findbugs.HRS_REQUEST_PARAMETER_TO_HTTP_HEADER.name=安全风险 - HTTP响应拆分漏洞
rule.findbugs.DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED.name=高危 - 希望传入Runnable的地方传入了一个Thread
rule.findbugs.NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH.name=错误用法 - null值会在exception处理中被用到
rule.findbugs.RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE.name=高危 - 已知的null值被重复的检测
rule.findbugs.DMI_CALLING_NEXT_FROM_HASNEXT.name=错误用法 - hasNext方法调用了next方法
rule.findbugs.HE_HASHCODE_USE_OBJECT_EQUALS.name=不良实践 - 定义了hashCode()的类使用了Object.equals()
rule.findbugs.VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED.name=错误用法 - 需要使用printf样式时使用了MessageFormat
rule.findbugs.NP_BOOLEAN_RETURN_NULL.name=不良实践 - 方法返回boolean类型返回了null
rule.findbugs.RI_REDUNDANT_INTERFACES.name=高危 - 类实现了父类一样的接口
rule.findbugs.DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE.name=多线程错误 - 在装箱的基本属性上使用了同步
rule.findbugs.STCAL_STATIC_CALENDAR_INSTANCE.name=多线程错误 - 静态Calendar
rule.findbugs.RR_NOT_CHECKED.name=不良实践 - 方法忽略InputStream.read()的返回值
rule.findbugs.IL_INFINITE_RECURSIVE_LOOP.name=错误用法 - 明显的无限递归循环
rule.findbugs.DMI_NONSERIALIZABLE_OBJECT_WRITTEN.name=高危 - 非持久化的对象写入了ObjectOutput
rule.findbugs.GC_UNCHECKED_TYPE_IN_GENERIC_CALL.name=不良实践 - 泛型调用中使用了未检查的类型
rule.findbugs.IMA_INEFFICIENT_MEMBER_ACCESS.name=试验 - 方法访问了一个拥有的类的私有成员
rule.findbugs.FI_PUBLIC_SHOULD_BE_PROTECTED.name=恶意代码漏洞 - Finalizer应该是protected,不能是public
rule.findbugs.RV_CHECK_FOR_POSITIVE_INDEXOF.name=高危 - 方法检查检查String.indexOf的结果是否为正数
rule.findbugs.ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT.name=高危 - 无符号右移转换为short/byte
rule.findbugs.DM_STRING_VOID_CTOR.name=性能 - 方法调用了低效的new String()构造方法
rule.findbugs.RE_POSSIBLE_UNINTENDED_PATTERN.name=错误用法 - "."用作正则表达式
rule.findbugs.WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL.name=多线程错误 - 在getClass上使用同步而不是在class文字上
rule.findbugs.ICAST_BAD_SHIFT_AMOUNT.name=错误用法 - 右移的数值不在0..31范围内
rule.findbugs.SF_SWITCH_FALLTHROUGH.name=Switch语句中一个case失败以后进入了下一个case
rule.findbugs.DP_DO_INSIDE_DO_PRIVILEGED.name=不良实践 - 方法调用应该在doPrivileged块中
rule.findbugs.NO_NOTIFY_NOT_NOTIFYALL.name=多线程错误 - 使用notify()而不是notifyAll()
rule.findbugs.SS_SHOULD_BE_STATIC.name=性能 - 未读取的属性:这个属性是否应该是static的?
rule.findbugs.DM_RUN_FINALIZERS_ON_EXIT.name=不良实践 - 方法调用了危险的runFinalizersOnExit方法
rule.findbugs.MS_FINAL_PKGPROTECT.name=恶意代码漏洞 - 属性应该同时是final 和 package protected的
rule.findbugs.BC_BAD_CAST_TO_CONCRETE_COLLECTION.name=高危 - 转换成具体集合可能有问题
rule.findbugs.BIT_IOR_OF_SIGNED_BYTE.name=错误用法 - 在带符号的byte值上进行位OR运算
rule.findbugs.MSF_MUTABLE_SERVLET_FIELD.name=多线程错误 - 可变的servlet属性
rule.findbugs.SE_BAD_FIELD_INNER_CLASS.name=不良实践 - 非serializable类有一个可序列化的内部类
rule.findbugs.BIT_ADD_OF_SIGNED_BYTE.name=错误用法 - 在带符号的byte值上进行位add运算
rule.findbugs.FI_FINALIZER_ONLY_NULLS_FIELDS.name=不良实践 - Finalizer中子还有null属性
rule.findbugs.DE_MIGHT_IGNORE.name=不良实践 - 方法可能忽略异常
rule.findbugs.XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER.name=安全风险 - Servlet反射跨域脚本漏洞
rule.findbugs.ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD.name=多线程错误 - 使用同步的属性可能发生改变
rule.findbugs.SQL_BAD_PREPARED_STATEMENT_ACCESS.name=错误用法 - 方法尝试访问PreparedStatement参数的索引是0
rule.findbugs.DM_CONVERT_CASE.name=国际化 - 考虑使用国际化参数型的调用方法版本
rule.findbugs.SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS.name=高危 - 类的transient属性不能序列化
rule.findbugs.NN_NAKED_NOTIFY.name=多线程错误 - 未使用同步包裹的notify
rule.findbugs.VA_FORMAT_STRING_MISSING_ARGUMENT.name=错误用法 - 格式化字符串引用的参数丢失
rule.findbugs.IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION.name=不良实践 - 父类初始化时使用了子类
rule.findbugs.SA_LOCAL_SELF_COMPARISON.name=错误用法 - 自己和自己的值比较
rule.findbugs.IM_BAD_CHECK_FOR_ODD.name=高危 - 对奇偶判断不能用于负数
rule.findbugs.NP_CLOSING_NULL.name=错误用法 - close()调用了一个永远是null的值
rule.findbugs.XSS_REQUEST_PARAMETER_TO_JSP_WRITER.name=安全风险 - JSP反射调用跨域脚本漏洞
rule.findbugs.IS_FIELD_NOT_GUARDED.name=多线程错误 - 属性不能保证同步访问
rule.findbugs.DM_GC.name=性能 - 直接调用垃圾回收,特别是在性能测试中的可疑代码
rule.findbugs.IM_MULTIPLYING_RESULT_OF_IREM.name=错误用法 - 整数乘法的结果是整数
rule.findbugs.SE_COMPARATOR_SHOULD_BE_SERIALIZABLE.name=不良实践 - Comparator没有实现Serializable
rule.findbugs.HE_HASHCODE_NO_EQUALS.name=不良实践 - 类定义了hashCode()但是没定义equals()
rule.findbugs.MF_CLASS_MASKS_FIELD.name=错误用法 - 类定义了属性覆盖了父类的属性
rule.findbugs.NM_VERY_CONFUSING_INTENTIONAL.name=不良实践 - 非常迷惑的方法名称(可能是内部方法)
rule.findbugs.SR_NOT_CHECKED.name=不良实践 - 方法忽略了InputStream.skip()的结果
rule.findbugs.LI_LAZY_INIT_STATIC.name=多线程错误 - 错误的对static属性进行了延迟初始化
rule.findbugs.DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION.name=错误用法 - 不能使用反射检测没有标记为runtime rentention的注解的存在
rule.findbugs.ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH.name=不良实践 - 方法可能在关闭database资源时因为异常失败
rule.findbugs.BIT_IOR.name=错误用法 - 不兼容的位掩码(BIT_IOR)
rule.findbugs.ODR_OPEN_DATABASE_RESOURCE.name=不良实践 - 方法可能在关闭database资源时失败
rule.findbugs.IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN.name=错误用法 - 参数没有被使用,但是被重新赋值了
rule.findbugs.SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING.name=安全风险 - 使用非常量字符串创建了一个PreparedStatement
rule.findbugs.UUF_UNUSED_FIELD.name=性能 - 无用的属性
rule.findbugs.RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE.name=错误用法 - 对一个已经使用的值进行了null检测
rule.findbugs.EQ_OTHER_USE_OBJECT.name=错误用法 - equals()方法定义没有覆盖Object.equals(Object)
rule.findbugs.SP_SPIN_ON_FIELD.name=多线程错误 - 方法对一个属性循环复制
rule.findbugs.SI_INSTANCE_BEFORE_FINALS_ASSIGNED.name=不良实践 - 在所有静态final属性赋值之前static初始化块创建了一个实例
rule.findbugs.NP_ALWAYS_NULL_EXCEPTION.name=错误用法 - 方法的异常路径中引用了空指针
rule.findbugs.MS_EXPOSE_REP.name=恶意代码漏洞 - Public static方法可能因为返回了一个数组而暴露内部实现
rule.findbugs.VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN.name=高危 - 非布尔参数使用%b进行了格式化
rule.findbugs.MS_PKGPROTECT.name=恶意代码漏洞 - 属性应该是package protected
rule.findbugs.NP_NONNULL_RETURN_VIOLATION.name=错误用法 - 方法可能返回null,但是声明了 @NonNull
rule.findbugs.J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION.name=不良实践 - 在HttpSession中保存了不可序列化的对象
rule.findbugs.NM_SAME_SIMPLE_NAME_AS_SUPERCLASS.name=不良实践 - 类名不应该和父类的名称相同
rule.findbugs.DMI_BLOCKING_METHODS_ON_URL.name=性能 - URL的equals 和 hashCode 方法会被堵塞
rule.findbugs.HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS.name=错误用法 - 在哈希构造中声明了不能哈希的类
rule.findbugs.UR_UNINIT_READ.name=错误用法 - 构造方法中对未初始化的类进行了读取
rule.findbugs.WA_NOT_IN_LOOP.name=多线程错误 - Wait不在循环中
rule.findbugs.DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_EXECUTOR.name=错误用法 - 尝试修改ScheduledThreadPoolExecutor的最大数
rule.findbugs.RV_RETURN_VALUE_IGNORED2.name=错误用法 - 方法忽略了返回值
rule.findbugs.NM_FIELD_NAMING_CONVENTION.name=属性名应该以小写字母开头
rule.findbugs.FB_UNEXPECTED_WARNING.name=试验 - 未期待/未期望的findbugs警告
rule.findbugs.BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR.name=错误用法 - 基础类型拆箱后用于三元表达式
rule.findbugs.DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED.name=不良实践 - Classloaders应该只在doPrivileged块中被创建
rule.findbugs.NM_WRONG_PACKAGE.name=错误用法 - 方法没有覆盖父类的方法,因为参数的包不正确
rule.findbugs.IL_CONTAINER_ADDED_TO_ITSELF.name=错误用法 - 一个集合被添加到自身
rule.findbugs.CI_CONFUSED_INHERITANCE.name=高危 - 类是final的,但是定义了protected属性
rule.findbugs.HE_USE_OF_UNHASHABLE_CLASS.name=错误用法 - 在哈希数据结构中使用的类没有定义hashCode()方法
rule.findbugs.IJU_SUITE_NOT_STATIC.name=错误用法 - TestCase实现了非static suite方法
rule.findbugs.RS_READOBJECT_SYNC.name=多线程错误 - 类的readObject()方法不是同步的
rule.findbugs.AM_CREATES_EMPTY_JAR_FILE_ENTRY.name=不良实践 - 创建了一个空的jar方法入口
rule.findbugs.VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY.name=错误用法 - 使用格式化字符串对数组进行了无用的格式化
rule.findbugs.SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW.name=switch语句失败抛出异常导致无用的存储
rule.findbugs.RV_ABSOLUTE_VALUE_OF_HASHCODE.name=错误用法 - 错误的尝试计算带符号的32位hashcodde的绝对值
rule.findbugs.EQ_DONT_DEFINE_EQUALS_FOR_ENUM.name=错误用法 - 枚举定义了协变equals()方法定义
rule.findbugs.SA_FIELD_DOUBLE_ASSIGNMENT.name=错误用法 - 对属性进行双重赋值
rule.findbugs.DMI_COLLECTION_OF_URLS.name=性能 - URL的Maps 和 sets可能是性能大问题
rule.findbugs.NM_SAME_SIMPLE_NAME_AS_INTERFACE.name=不良实践 - 类名不应该和实现的接口名相同
rule.findbugs.UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR.name=错误用法 - 构造方法没有初始化属性
rule.findbugs.TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK.name=错误用法 - 值可能带着一个类型修饰符,一直使用的方式是与这个类型修饰符相悖的
rule.findbugs.SE_NONLONG_SERIALVERSIONID.name=不良实践 - serialVersionUID不是long型
rule.findbugs.RV_REM_OF_HASHCODE.name=高危 - hashCode的结果可能是负数negative
rule.findbugs.NS_DANGEROUS_NON_SHORT_CIRCUIT.name=高危 - 潜在危险使用非短跳出逻辑
rule.findbugs.USM_USELESS_SUBCLASS_METHOD.name=试验 - 方法代理到父类方法
rule.findbugs.ITA_INEFFICIENT_TO_ARRAY.name=性能 - 方法使用了toArray()对空数组参数
rule.findbugs.DM_MONITOR_WAIT_ON_CONDITION.name=多线程错误 - 根据条件监控wait()的调用
rule.findbugs.BOA_BADLY_OVERRIDDEN_ADAPTER.name=错误用法 - 类覆盖了父类中实现的方法适配器错误
rule.findbugs.IC_INIT_CIRCULARITY.name=高危 - 初始化死循环
rule.findbugs.NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER.name=不良实践 - 使用的标记是未来java版本中的关键字
rule.findbugs.EC_UNRELATED_CLASS_AND_INTERFACE.name=错误用法 - equals()比较无关的类和接口
rule.findbugs.TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK.name=错误用法 - 值可能没有携带一个类修饰符,但是使用中会一直需要这个类修饰符
rule.findbugs.FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER.name=错误用法 - 测试是否与NaN相等
rule.findbugs.NM_CONFUSING.name=不良实践 - 迷惑的方法名
rule.findbugs.VA_FORMAT_STRING_ARG_MISMATCH.name=错误用法 - 格式化字符串参数的数目与占位符不相等
rule.findbugs.NP_NULL_ON_SOME_PATH_EXCEPTION.name=错误用法 - 方法的异常路径中可能引用空指针
rule.findbugs.DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE.name=多线程错误 - 同步装箱基本类型可能导致死锁
rule.findbugs.IJU_TEARDOWN_NO_SUPER.name=错误用法 - TestCase定义的tearDown没有调用super.tearDown()
rule.findbugs.SE_READ_RESOLVE_IS_STATIC.name=错误用法 - readResolve方法没有生命为static方法
rule.findbugs.NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE.name=高危 - 这个路径上空指针引用是不可实现的
rule.findbugs.UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS.name=错误用法 - 匿名内部类中定义的不可调用的方法
rule.findbugs.VA_FORMAT_STRING_BAD_CONVERSION.name=错误用法 - 提供的参数类型与格式化标记不符
rule.findbugs.EC_ARRAY_AND_NONARRAY.name=错误用法 - equals()用来比较数组和非数组
rule.findbugs.NM_BAD_EQUAL.name=类定义了equal(Object),应该是equals(Object)吧?
rule.findbugs.EC_UNRELATED_TYPES_USING_POINTER_EQUALITY.name=错误用法 - 使用指针比较不同的类型
rule.findbugs.STI_INTERRUPTED_ON_CURRENTTHREAD.name=错误用法 - currentThread()调用的不必要用法,调用了interrupted()
rule.findbugs.RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION.name=错误用法 - File.separator用做正则表达式
rule.findbugs.MWN_MISMATCHED_WAIT.name=多线程错误 - 不匹配的wait()
rule.findbugs.IL_INFINITE_LOOP.name=错误用法 - 明显的无限循环
rule.findbugs.NP_IMMEDIATE_DEREFERENCE_OF_READLINE.name=高危 - 立刻使用了readLine()的结果
rule.findbugs.SC_START_IN_CTOR.name=多线程错误 - 构造方法调用了Thread.start()
rule.findbugs.STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE.name=多线程错误 - 静态DateFormat
rule.findbugs.HE_EQUALS_NO_HASHCODE.name=不良实践 - 类定义了equals(),但是没有hashCode()
rule.findbugs.UL_UNRELEASED_LOCK.name=多线程错误 - 方法没有在任何路径中释放锁
rule.findbugs.PZLA_PREFER_ZERO_LENGTH_ARRAYS.name=高危 - 考虑返回空数组而不是null
rule.findbugs.SKIPPED_CLASS_TOO_BIG.name=高危 - 类太大不能分析
rule.findbugs.NP_ARGUMENT_MIGHT_BE_NULL.name=错误用法 - 方法没有检查空参数
rule.findbugs.UM_UNNECESSARY_MATH.name=性能 - 方法常量调用了静态Math类方法
rule.findbugs.NM_WRONG_PACKAGE_INTENTIONAL.name=不良实践 - 方法没有覆盖父类的方法因为参数包名错误
rule.findbugs.NP_NONNULL_PARAM_VIOLATION.name=错误用法 - 方法传递null给一个非空参数
rule.findbugs.BIT_AND_ZZ.name=错误用法 - 检查 ((...) & 0) == 0 是否成立
rule.findbugs.HRS_REQUEST_PARAMETER_TO_COOKIE.name=安全风险 - HTTP cookie可能来自不被信任的输入
rule.findbugs.SQL_BAD_RESULTSET_ACCESS.name=错误用法 - 方法尝试访问一个ResultSet,但是使用的index是0
rule.findbugs.INT_VACUOUS_COMPARISON.name=高危 - 整形的空比较
rule.findbugs.EQ_COMPARETO_USE_OBJECT_EQUALS.name=不良实践 - 类定义了compareTo(...),但使用了Object.equals()
rule.findbugs.DMI_HARDCODED_ABSOLUTE_FILENAME.name=高危 - 类包含一个硬编码的绝对路径
rule.findbugs.DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES.name=错误用法 - 集合不应该包含自身
rule.findbugs.URF_UNREAD_FIELD.name=性能 - 读不到的属性
rule.findbugs.DLS_OVERWRITTEN_INCREMENT.name=错误用法 - 重写了自增
rule.findbugs.BIT_SIGNED_CHECK.name=不良实践 - 检测带符号的位运算
rule.findbugs.UWF_NULL_FIELD.name=错误用法 - 属性曾经设置为null
rule.findbugs.DE_MIGHT_DROP.name=不良实践 - 方法可能抛出异常
rule.findbugs.DMI_BAD_MONTH.name=错误用法 - 对于month错误的常量值
rule.findbugs.MS_MUTABLE_ARRAY.name=恶意代码漏洞 - 属性是可变数组
rule.findbugs.SE_INNER_CLASS.name=不良实践 - 可序列化的内部类
rule.findbugs.OS_OPEN_STREAM_EXCEPTION_PATH.name=不良实践 - 方法可能在关闭流时因为异常而失败
rule.findbugs.AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION.name=并发抽象的顺序调用可能不是原子的
rule.findbugs.BX_UNBOXING_IMMEDIATELY_REBOXED.name=装箱的值被拆箱,然后立刻重新装箱了
rule.findbugs.CO_COMPARETO_RESULTS_MIN_VALUE.name=compareTo()或compare()返回Integer.MIN_VALUE
rule.findbugs.DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD.name=无用的局部变量可能与实例属性同名
rule.findbugs.DMI_ARGUMENTS_WRONG_ORDER.name=方法参数顺序翻转
rule.findbugs.DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE.name=由double构造BigDecimal时没有指定精确度
rule.findbugs.DMI_DOH.name=一个明显不合理的方法调用
rule.findbugs.DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS.name=一个入口的添加可能因为重用Entry对象导致失败
rule.findbugs.DM_DEFAULT_ENCODING.name=信任默认字符编码
rule.findbugs.ICAST_INT_2_LONG_AS_INSTANT.name=int转换成long,用来当做绝对时间
rule.findbugs.INT_BAD_COMPARISON_WITH_INT_VALUE.name=错误比较int值和long常量
rule.findbugs.JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT.name=在util.concurrent抽象中使用监控样式的wait方法
rule.findbugs.NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD.name=读取了未初始化的public或protected属性
rule.findbugs.OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE.name=方法可能因为checked exception导致清理流或资源失败
rule.findbugs.PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS.name=不用在iterator里重用entry对象
rule.findbugs.RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE.name=compareTo返回的值与指定的值进行检测
rule.findbugs.RV_NEGATING_RESULT_OF_COMPARETO.name=调换了compareTo()/compare()结果的正负
rule.findbugs.RV_RETURN_VALUE_IGNORED_INFERRED.name=方法忽略了返回值,这是正常的吗?
rule.findbugs.SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD.name=局部变量给自己赋值而不是赋值到实例变量中
rule.findbugs.URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD.name=未被读取的public/protected属性
rule.findbugs.UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD.name=未被使用的public 或 protected 属性
rule.findbugs.UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD.name=未初始化的public 或 protected 属性
rule.findbugs.VA_FORMAT_STRING_USES_NEWLINE.name=格式化代码应该使用%n代替\n
rule.findbugs.VO_VOLATILE_INCREMENT.name=volatile的自增操作不是原子的

 

枚举类是程序中常用的一种类型,当经常面对说明与标识混乱的情况。在此记录一个枚举类的写法,方便标识与说明的绑定

基类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class StandardType {
private String key;
private String title;

public StandardType(String key, String title) {
this.title = title;
this.key = key;
}

public String getTitle() {
return title;
}

public static String getTitle(StandardType[] values, String key) {
StandardType val = StandardType.getEnum(values, key);
if (val == null) {
return null;
} else {
return val.getTitle();
}
}

public String getKey() {
return key;
}

public static String getKey(StandardType[] values, String title) {
for (StandardType val : values) {
if (val.getTitle().equals(title)) {
return val.getKey();
}
}
return null;
}

public static StandardType getEnum(StandardType[] values, String key) {
for (StandardType val : values) {
if (val.getKey().equals(key)) {
return val;
}
}
return null;
}

public String toString() {
return key;
}

public boolean equals(StandardType type) {
if (type == null) {
return false;
}
return this.key.equals(type.getKey());
}

/**
* get value options based on values
*
* @param values
* @return
*/
public static List<Map<String, String>> getOpts(StandardType[] values) {
List<Map<String, String>> opts = new ArrayList<Map<String, String>>();
Map<String, String> opt = null;
for (StandardType val : values) {
opt = new HashMap<String, String>();
opt.put("key", val.getKey());
opt.put("title", val.getTitle());
opts.add(opt);
}
return opts;
}

/**
* get value options based on values(Fuzzy query)
*
* @param values
* @return
*/
public static List<Map<String, String>> getSimilarOpts(StandardType[] values, String input) {
List<Map<String, String>> opts = new ArrayList<Map<String, String>>();
Map<String, String> opt = null;
for (StandardType val : values) {
if (val.getTitle().contains(input)) {
opt = new HashMap<String, String>();
opt.put("key", val.getKey());
opt.put("title", val.getTitle());
opts.add(opt);
}
}
return opts;
}
}

枚举类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 支付方式
*/
public static class PayWay extends StandardType {
public final static PayWay WeChatPay = new PayWay("WeChatPay", "微信支付");
public final static PayWay AliPay = new PayWay("AliPay", "支付宝支付");
public final static PayWay UnionPay = new PayWay("UnionPay", "银联支付");
public final static PayWay CashPay = new PayWay("CashPay", "现金支付");
public final static PayWay[] values = { WeChatPay, AliPay, UnionPay, CashPay };

public PayWay(String key, String title) {
super(key, title);
}
}

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
PayWay.AliPay.toString();// AliPay
// dome1
StandardType patWay = PayWay.getEnum(PayWay.values, "AliPay");
patWay.getKey();// AliPay
patWay.getTitle();// 支付宝支付
// dome2
PayWay.getKey(PayWay.values, "支付宝支付");// AliPay
PayWay.getTitle(PayWay.values, "AliPay");// 支付宝支付
// dome3
List<Map<String, String>> listMap1 = PayWay.getOpts(PayWay.values);//所有map
List<Map<String, String>> listMap2 = PayWay.getSimilarOpts(PayWay.values, "支");//一条支付宝的map
}

 

Jackson转换泛型List出现错误java.util.LinkedHashMap cannot be cast to com.xxx

1
2
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(new File(fileAPI.getRoot(), jsonFileName), Map.class);

当使用Jackson解析具体的bean时,应该使用尽量详尽的本来解析,而使用Map.class、List.class解析时,会对具体的bean解析不出

使用new TypeReference<List>(){},或者具体的Object.class,

注:Object为具体的解析类

bulk批处理mongodb,比普通的js脚本来的更快一些。

官方网址:https://docs.mongodb.com/manual/reference/method/Bulk/

bulk支持的方法:
Name Description
Bulk.insert()
Adds an insert operation to a list of operations.
Bulk.find()
Specifies the query condition for an update or a remove operation.
Bulk.find.removeOne()
Adds a single document remove operation to a list of operations.
Bulk.find.remove()
Adds a multiple document remove operation to a list of operations.
Bulk.find.replaceOne()
Adds a single document replacement operation to a list of operations.
Bulk.find.updateOne()
Adds a single document update operation to a list of operations.
Bulk.find.update()
Adds a 

multi
 update operation to a list of operations.
Bulk.find.upsert()
Specifies 

upsert: true
 for an update operation.
Bulk.execute()
Executes a list of operations in bulk.
Bulk.getOperations()
Returns an array of write operations executed in the 

Bulk()
 operations object.
Bulk.tojson()
Returns a JSON document that contains the number of operations and batches in the 

Bulk()
 operations object.
Bulk.toString()
Returns the 
Bulk.tojson()
 results as a string.

bulk插入示例:

1
2
3
4
5
	var bulk = db.items.initializeUnorderedBulkOp();
bulk.insert( { item: "abc123", defaultQty: 100, status: "A", points: 100 } );
bulk.insert( { item: "ijk123", defaultQty: 200, status: "A", points: 200 } );
bulk.insert( { item: "mop123", defaultQty: 0, status: "P", points: 0 } );
bulk.execute();

 

bulk更新示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 批量更新数据库对象
* 1. 按条件批量更新
* 2. 无条件批量更新
*/

/** 1. 按条件批量更新 **/
// step 1: get key-value
var idArray = [];
var valueArray = [];
var idx = -1;
db.conch_ChargeSchedule.find({'predictChargeValue':{$exists:false}}).forEach(function(obj){
idx++;
idArray[idx]=obj._id;
valueArray[idx]=obj.planValue;
});
// step 2: update
var bulk = db.conch_ChargeSchedule.initializeUnorderedBulkOp();
for(var i=0; i<idArray.length; i++){
bulk.find( { _id: idArray[i] } ).update({ $set: { predictChargeValue: valueArray[i] } });
}
bulk.execute();

/** 2. 无条件批量更新 **/
var bulk = db.conch_ChargeSchedule.initializeUnorderedBulkOp();
bulk.find({}).update({ $set: { isPlanValueUpdatable: true, isStatusUpdatable:true, isStartDateUpdatable:true } });
bulk.execute();
1
2
3
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "D" } ).updateOne( { $set: { status: "I", points: "0" } } );
bulk.execute();

打印字符串:

1
2
3
4
5
var bulk = db.items.initializeOrderedBulkOp();
bulk.insert( { item: "abc123", status: "A", defaultQty: 500, points: 5 } );
bulk.insert( { item: "ijk123", status: "A", defaultQty: 100, points: 10 } );
bulk.find( { status: "D" } ).removeOne();
bulk.toString();

移除:

1
2
3
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "D" } ).remove();
bulk.execute();

 

替换:

1
2
3
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { item: "abc123" } ).replaceOne( { item: "abc123", status: "P", points: 100 } );
bulk.execute();

插入并更新:

1
2
3
4
5
6
7
8
9
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "P", item: null } ).upsert().updateOne(
{
$setOnInsert: { defaultQty: 0, inStock: true },
$currentDate: { lastModified: true },
$set: { points: "0" }
}
);
bulk.execute();

获得历史:

1
2
3
4
5
6
7
8
var bulk = db.items.initializeUnorderedBulkOp();

for (var i = 1; i <= 1500; i++) {
bulk.insert( { x: i } );
}

bulk.execute();
bulk.getOperations();// 获得操作历史

普通的js脚本更新mongodb库,为单线程阻塞方式,有数据大小限制,数据大了容易断掉。bulk的则不会出现这种状况,效率max

0%