MySQL Emoji 表情字符支持

2018-11-01

utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常:

java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94 for column name at row 1

针对该问题处理最简单的方式是更改数据库的编码为utf8mb4,直接将问题扼杀在摇篮中。

前置条件

  • MySQL服务器版本不能低于5.5.3;
  • MySQL驱动版本不能低于5.1.13;

配置文件调整(my.cnf)

[client] 
default-character-set = utf8mb4 
[mysql] 
default-character-set = utf8mb4 
[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_general_ci 
init_connect='SET NAMES utf8mb4'

重启数据库。

检查数据库变量

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8mb4
collation_connection utf8mb4_general_ci
collation_database utf8mb4_general_ci
collation_server utf8mb4_general_ci

更改现有数据库、表、字段编码

ALTER DATABASE `ticketdb` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `ticket_description` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `ticket_description`
MODIFY COLUMN `description`  text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '工单描述' AFTER `id`;

如此一来,emoji表情应该不是问题了。

阅读全文...

Ewei Dubbo自定义Http协议返回值过滤器

2018-10-31

公司将Dubbo又封装了一层,通过注解直接暴露Service接口,在序列化返回结果时,简单粗暴的将实体的所有非空属性全部序列化出来了,接口的返回体相当庞大,很是浪费资源。

核心实现

使用FastJson的com.alibaba.fastjson.serializer.PropertyFilter,在序列化时,排除相关的属性,核心代码如下:

PropertyFilter profilter = new PropertyFilter(){
    @Override
    public boolean apply(Object object, String name, Object value) {
        if(name.equalsIgnoreCase("password")){
            return false;  // 排除password 属性
        }
        return true;
    }
};
serializer.addFilter(profilter);

V2接口基于Dubbo相关协议封装(JavaDoc:http://doc.ewei.ren/budo-dubbo-protocol-http/),在序列化接口返回信息时,没有做相关的配置;

其核心序列化逻辑在org.budo.dubbo.protocol.http.view.render.ViewRendercom.ewei.common.dubbo.http.view.render.EweiDubboHttpApiJsonViewRender实现类中,见下图:

image

现只需要在序列化之前,添加相关的PropertyFilter即可。

serializer.addFilter(new XxxPropertyFilter());
阅读全文...

Kibana中使用的lucene查询语法详解

2018-10-11

Kibana是一个分析和可视化平台,可用来搜索、查看、交互存放在Elasticsearch索引里的数据

image

本文简单概括在搜索框中使用lucene查询语法检索相关的日志数据。

全文搜索

直接输入关键字,将返回所有字段值中包含关键字的文档:

image

使用双引号包起来作为一个短语搜索精准匹配:

"providerId\=719"

image

阅读全文...

在SpringBoot中优雅的集成Dubbo

2018-10-11

在springboot中集成dubbo示例(非注解),废话少说,直入正题。

pom

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.8.4</version>
  <exclusions>
    <exclusion>
      <artifactId>spring</artifactId>
      <groupId>org.springframework</groupId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.4.6</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>com.github.sgroschupf</groupId>
  <artifactId>zkclient</artifactId>
  <version>0.1</version>
</dependency>
阅读全文...

Java11 部分新特性一览

2018-09-30

9月26日,Java 11(LTS 长期支持版)如期而至,虽然短期很难投入生产使用(毕竟现在还在用jdk7呢,哈哈哈哈)但是还是非常有必要了解一下相关的特性的。

jshell

使用jshell可以像python交互模式那样直接运行代码

image

编译 && 运行

简化了javac & java命令

javac Test.java
java Test

## jdk 11
java Test.java
阅读全文...

当当网Dubbox框架使用示例

2018-09-28

Dubbox是当当网基于阿里巴巴dubbo衍生出来的一个新版本,以下是在官网摘抄的相关特性:  

  • 支持REST风格远程调用(HTTP + JSON/XML)
  • 支持基于Jackson的JSON序列化
  • 支持基于嵌入式Tomcat的HTTP remoting体系
  • 升级ZooKeeper客户端:将dubbo中的zookeeper客户端升级到最新的版本,以修正老版本中包含的bug。
  • 支持完全基于Java代码的Dubbo配置:基于Spring的Java Config,实现完全无XML的纯Java代码方式来配置dubbo

Dubbox 环境搭建

由于dubbox相关的jar没有发布到maven中心仓库,故只能自行下载源码编译然后打入本地仓库或私服使用。

以下编译过程均在windows环境上执行,使用git bash.exe

$ git clone https://github.com/dangdangdotcom/dubbox.git
$ cd dubbox
$ mvn install -Dmaven.test.skip=true

Zookeeper 环境搭建

默认使用zookeeper作为服务注册中心,故需要先行安装(步骤略)

修改配置文件zoo.cfg:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\zookeeper-3.4.11\\data
dataLogDir=D:\\zookeeper-3.4.11\\log
clientPort=2181
阅读全文...

使用Selenium-Java实现自动化UI测试

2018-09-23

ChromeDriver

https://npm.taobao.org/mirrors/chromedriver/

下载指定版本的 chromedriver 后,放入 PATH 中。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wuwenze.test</groupId>
    <artifactId>selenium-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
        </dependency>
    </dependencies>
</project>
阅读全文...

Spring Cacheable 注解相关说明

2018-09-14

关于@Cacheable注解的作用不做过多说明,文本主要针对该注解的key自定义策略规则提供一些示例。

Cacheable

属性名 必填? 描述
value 必填 缓存的命名空间
key 可选 指定一个唯一的key(在缓存命名空间中),使用SpEL表达式
condition 可选 限定条件,哪种情况使用缓存,使用SpEL表达式
unless 可选 限定条件,哪种情况下不使用缓存,使用SpEL表达式

key

默认情况下,key属性可以不填,Spring会按照默认策略去生成缓存相关的key(这里不细究了)

该属性在自定义时,通常使用SpEL表达式来声明,以下是一些常见的例子:

通过方法参数作为key:

```java @Cacheable(value = “findByUserIdCached”, key = “#userId”) public User findByUserIdCached(Integer userId) { return userDao.findByUserId(userId); }

// 还有一种写法:#p0 表示第一个参数 @Cacheable(value = “findByUserIdCached”, key = “#p0”) public User findByUserIdCached(Integer userId) { return userDao.findByUserId(userId); }

阅读全文...