Java代码精简神器Lombok的使用

2018-09-06

Java 代码中有很多冗余、臃肿的代码(如:Getter/Setter、构造方法、hashCode 方法等)lombok 是一款 IDE 插件,其专注于消除此类代码,以达到代码简洁高效的目的。它同时提供了 IDEA 以及 Eclipse 相关的插件,本文以 IDEA 为例,做一些相关的示例

准备工作

1)IDEA 中安装相关的插件,如图:

image

2)IDEA 编译器相关设置,如图:

image

构建项目

以 SpringBoot 项目为例,以下为 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.example</groupId>
    <artifactId>lombok-example</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>lombok-example</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</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>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
阅读全文...

使用Maven打包可执行jar

2018-08-29

SpringBoot工程

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
  <mainClass>com.wuwneze.springbootexample.SpringbootExampleApplication</mainClass>
</configuration>
<executions>
  <execution>
    <goals>
      <goal>repackage</goal>
    </goals>
  </execution>
</executions>
</plugin>

普通Java工程

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
  <descriptorRefs>
    <descriptorRef>jar-with-dependencies</descriptorRef>
  </descriptorRefs>
  <archive>
    <manifest>
      <mainClass>com.wuwenze.Main</mainClass>
    </manifest>
  </archive>
</configuration>
<executions>
  <execution>
    <id>make-assembly</id>
    <phase>package</phase>
    <goals>
      <goal>single</goal>
    </goals>
  </execution>
</executions>
</plugin>

使用该插件生成的jar包,带jar-with-dependencies后缀的jar文件,可以直接运行。

如何打包

mvn clean install package

题外话:如何让linux命令保持后台运行?

nohup java -jar test-0.0.1-SNAPSHOT-jar-with-dependencies.jar >test.log 2>&1 &
阅读全文...

使用JMeter录制性能测试脚本

2018-08-28

JMeter是一个开源的基于Java的性能测试工具,使用起来真的是即”方便”又”强大”

新建线程组

用于存放录制结果

新建代理服务器

  1. 测试计划->新建非测试原件->HTTP代理服务器
  2. TestPlan Creation 将目标控制器设置为:测试计划>线程组 (录制后的请求信息将加到此线程组中来)
  3. Requests Filtering 请求过滤,排除无关的请求,具体配置如下:

包含模式:只录制指定主机的请求

.+(itkeeping\.com).+

排除模式:排除静态请求

(?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2)
阅读全文...

微信小程序模板消息推送实现案例

2018-08-21

模板消息是基于微信的通知渠道,为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验。

想推送模板消息,得满足一些前提条件:

  1. 用户在小程序中完成支付后,小程序可以向用户发送模板消息。
  2. 用户在小程序中有提交表单的行为,小程序可以向用户发送模板消息。

例如:

  1. 用户在小程序里购买了商品,小程序可以将商品物流的情况,实时发送给用户。
  2. 用户在小程序里填写了活动报名表后,小程序可以将报名情况(成功或失败)推送给用户。

需要注意的是,即使条件达成了,小程序也不能无限制地发送模板消息。

具体的发送数量限制是:

  1. 用户完成一次支付,小程序可以获得 3 次发送模板消息的机会。
  2. 用户提交一次表单,小程序可以获得 1 次发送模板消息的机会。
  3. 发送模板消息的机会在用户完成操作后的 7 天内有效。一旦超过 7 天,这些发送资格将会自动失效。
阅读全文...

使用MockMvc在SpringBoot中进行单元测试

2018-08-10

在开发好常规的RESTful接口后,难免会依次进行单元测试,一般来说使用Postman即可, 但是依然是不太方便,有没有更方便,更优雅的方式呢?

MockMvc

org.springframework.test.web.servlet.MockMvc

MockMvc是由Spring提供的,作用是在单元测试代码中,伪造一套MVC环境,常见的方法如下:

Method Remark
perform 执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
get/post/delete/put 声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object… urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
param 添加request的参数
content 添加requestBody的参数
contentType 设置contentType属性
header 设置header属性
andExpect 添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确(对返回的数据进行的判断);
andDo 添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
andReturn 最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);
阅读全文...

Java8 Stream Api使用详解

2018-08-07

jdk8发布至今已有几年有余,是一个影响深远且具有革命意义的版本,目前jdk版本已直奔v11.0, 发展之迅速让人始料未及。本文在假设已有 java8 lambda 语法的基础下,通过几个示例,快速上手Stream 流处理相关的 API 使用。

什么是流操作

流操作就是一条流水线,将元素放在流水线上一个个地进行处理: 

List<User> list = Lists.newArrayList(user1,user2);
List<String> resultList =
    list.
    // 将集合转换成流对象
    stream()
    // 将List<User>遍历,将每个元素的name取出,组装成新的List<String>
    .map(User::getName)
    // 按照默认规则排序
    .sorted()
    // 只取20条数据
    .limit(20)
    // 收集流数据,组装成最终需要集合(List<String>)
    .collect(toList())

在以上的代码中,通过短短的几行代码,行云流水般的完成了一系列操作,这些操作在 jdk7 之前,是远远不能如此简单明了而高效的。

阅读全文...

DingTalk-通讯录单向同步实现示例

2018-07-27

最近项目中需要实现对接钉钉,并实现单向通讯录同步(钉钉服务器 -> 对接平台)本文通过一个简单的案例快速实现相关的DEMO (本文主要实现与钉钉对接)。

钉钉API:https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.LucpAu&treeId=385&articleId=104975&docType=1#s7

流程示意图

image

准备工作

在使用回调接口前,需要做以下准备工作:

  1. 提供一个接收消息的RESTful接口。
  2. 调用钉钉API,主动注册回调通知。
  3. 因为涉及到消息的加密解密,默认的JDK存在一些限制,先要替换相关jar:
阅读全文...