可以把方法设置成返回 ResponseEntity<T> 类型,其中的泛型T取代以前想返回的类型,然后通过 ResponseEntity.status(HttpStatus.OK).body(result) 方法创建返回结果,其中第一个status就是设置返回的ResponseCode
1 |
|
可以把方法设置成返回 ResponseEntity<T> 类型,其中的泛型T取代以前想返回的类型,然后通过 ResponseEntity.status(HttpStatus.OK).body(result) 方法创建返回结果,其中第一个status就是设置返回的ResponseCode
1 | @PostMapping |
java8中提供了类似javascript Promise方式的写法:
1 | import java.util.concurrent.*; |
CompletableFurure 可参考javadoc https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/CompletableFuture.html
java的Lambda表达式介绍 http://blog.oneapm.com/apm-tech/226.html
自制ssl证书,报错:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Certificate signature algorithm disabled
原因是jre里信任的CA不包含自制CA,可以用keytools加入自制ca:
1 | keytool -import -noprompt -trustcacerts -alias YOURALIS -file 自制CA的PEM文件 -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit |
changeit 是默认密码
查看所有信任的CA可以用命令:
1 | keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts |
在高版本jdk,访问某些老网站时,可能出错:java.security.cert.CertPathValidatorException: Usage constraint TLSServer check failed: SHA1 used with certificate: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US. Usage was tls server
这是由于网站使用了SHA1的签名证书,而此版本JDK已经把SHA1证书列为禁止导致,如果要打开支持,可以编辑 %JAVA_HOME%/jre/lib/security/java.security文件,找到jdk.certpath.disabledAlgorithms=这行(后面值内容可能不同):
jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224
把里面SHA1部分删除掉改成
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
DSA keySize < 1024, EC keySize < 224
另外jdk.tls.disabledAlgorithms 也是类似禁止某些tls算法的。
mybatis调用存储过程和调用普通的sql略有区别:
例如:
1 | <select id="loginByWxOpenId" resultType="cn.devmgr.exam.domain.Token" statementType="CALLABLE"> |
传递的参数还是和普通sql一样,可以直接 #{} 来引用参数。
postgresql server提供了查询慢sql的方法,不过默认没有启动。
1 | create extension pg_stat_statements; |
安装插件就这一句sql,但pg_stat_statements还需要修改postgresql.conf,加入这句
1 | shared_preload_libraries = 'pg_stat_statements' |
默认的是有注释的shared_preload_libraries
更改完配置文件需要重启postgresql server
可以使用如下sql重置计数器
1 | select pg_stat_reset(); |
可以使用下面的sql查出来哪些sql执行的比较慢:
1 | select * from pg_stat_statements order by total_time desc limit 5; |
Java的异常默认都有堆栈信息,详细显示出来调用层次,这对查找错误原因很有帮助。今日遇到一个无堆栈信息的java.lang.NullPointerException
经查询原来是HotSpot VM提供的一种叫fast throw的优化导致的。
有些特定的隐式异常类型(NullPointerException、ArithmeticException( / 0)之类)如果在代码里某个特定位置被抛出过多次的话,HotSpot Server Compiler(C2)会透明的决定用fast throw来优化这个抛出异常的地方——直接抛出一个事先分配好的、类型匹配的异常对象。这个对象的message和stack trace都被清空。抛出这个异常的速度是非常快,不但不用额外分配内存,而且也不用爬栈;但反面就是可能正好是需要知道哪里出问题的时候看不到stack trace了。从Sun JDK5开始要避免C2做这个优化还得额外传个VM参数:-XX:-OmitStackTraceInFastThrow。
既然这种异常速度比较快,那么我们自定义的一些业务异常,有些是不会使用堆栈信息的,是不是也可这样做呢?是的。可以通过继承Throwable,使用构造函数Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)来实现。
如果不是继承的Throwable,其它异常也有类似的protected方法,例如RuntimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
ubuntu 16.x 可以修改/etc/systemd/system/tomcat 配置文件
1 | Environment=’CATALINA_OPTS=-Xms512M -Xmx2048M -server -XX:+UseParallelGC -XX:-OmitStackTraceInFastThrow‘ |
可以用下面的这段代码重现没有堆栈的异常:
1 | public class NpeThief { |
用java NpeThief运行,会输出2、0两行
用java -XX:-OmitStackTraceInFastThrow NpeTHief运行,则只会有2一行,也能直接感觉到Fast Throw优化带来的运行速度的提升。
使用命令
1 | crontab -e |
等时,会出现选择编辑器
no crontab for developer - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
这里没有vi,如果要使用vi,可以修改/etc/enviroment文件,增加一行
1 | EDITOR=vi |
也可以修改 /etc/profile增加一行
1 | export EDITOR=vi |
这样下次使用crontab -e就自动使用vi了
Java Exception :
java aes 256 java.security.InvalidKeyException: Illegal key size after installation the policy
这是由于jdk里不包含256位加密算法导致的
公司内部开发用的redmine, wiki等服务,计划在公司内网IP访问时可以直接访问,因为偶尔需要在家等远程访问需求,需要开放外网访问,计划在外网访问时增加一个基本认证机制,以限制外部人员获取信息。
首先使用htpasswd创建了一个用户密码文件
htpasswd -c /etc/nginx/.htpasswd developer
如果没有htpasswd命令可以通过 apt-get install apache2-utils 安装。
修改nginx的配置文件,加入以下内容
1 | if ($remote_addr ~ "^(192.168.1.|192.168.2.)" ) { |
测试(nginx -t)会出错:
nginx: [emerg] "auth_basic" directive is not allowed here in /etc/nginx/sites-enabled/default:31
改成
1 | set $realm "Restricted Content"; |
可解决。
如下代码:
1 | package com.test.websocket; |
第12行会有警告 Class
修改为:
1 | if(endpointClass.isAssignableFrom(chatServer.getClass())){ |
可消除警告。