web开发 之 Spring常用第三方库(FastJSON LogBack)

目录

引言

之前两篇文章介绍了Spring以及Spring中MongoDB的使用

web开发 之 Spring + IntelliJ Idea

web开发 之 Spring + MongoDB

本文介绍Spring中常用的两个第三方库

阿里巴巴出品的FastJSON

is a Java library that can be used to convert Java Objects into their JSON representation

它的目标是

Provide best performance in server side and android client.

Log4j作者的全新力作LogBack

reliable, generic, fast and flexible logging library for Java

LogBack也是Spring官方推荐的Log库, 以替代Apache Log4j2

创建SpringLibraryJsonLog工程

大概流程可以参考之前的两篇文章

New Project -> Spring Initializr -> 设置Name为SpringLibraryJsonLog, Type为Maven Project

spring-library-json-log_01.png

-> 接下来要注意的是, 在依赖配置里, 勾选Web, 如下图

spring-library-json-log_02.png

-> 然后, 设置Project Name为SpringLibraryJsonLog保存

-> 最后, 选择运行SpringLibraryJsonLogApplication即可

添加请求接口

创建完的项目还是一个空的项目, 我们来添加两个接口("/json" "/log"), 这两个接口只返回String信息以确认连接成功, 其中Method=GET

package com.example;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JsonController {

    @RequestMapping(value = "/json", method = RequestMethod.GET)
    @ResponseBody
    public String json() {
        return "json";
    }

}

以及

package com.example;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogController {

    @RequestMapping(value = "/log", method = RequestMethod.GET)
    @ResponseBody
    public String json() {
        return "log";
    }

}

这两个接口的代码很简单, 在此也不做过多解释了

FastJSON

JSON和Object的转换现在已经是开发的标配了

我们这里选择阿里巴巴出品的FastJSON, 因为它的中文文档比较完善

首先, 我们需要在工程的依赖中引入FastJSON, 在pom.xml中添加如下依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.11</version>
</dependency>

修改pom.xml记得import project以使依赖生效: View -> Tool Windows -> Maven Projects -> Reimport All Maven Projects

然后, 我们定义一个Customer Bean

package com.example;

import com.alibaba.fastjson.annotation.JSONField;

public class Customer {

    private String firstName;
    @JSONField(name = "last")
    private String lastName;

    public Customer() {}

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Override
    public String toString() {
        return String.format("Customer[firstName='%s', lastName='%s']", firstName, lastName);
    }

}

其中的@JSONField的用法详见这里

最后, 在JsonController中添加FastJSON的使用

package com.example;

import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JsonController {

    @RequestMapping(value = "/json", method = RequestMethod.GET)
    @ResponseBody
    public String json() {
        return JSON.toJSONString(new Customer("xiao", "ming"));
    }

}

我们再次访问该接口(/json), 此时获取的返回值是

spring-library-json-log_03.png

这里使用的HTTP Client工具是Postman

LogBack

Logback比Log4j更新, 它被视为是log4j的替代者

它比log4j的性能更好, 而且更完整地实现了slf4j的接口, 并且自带了更多的功能

比如自动压缩日志, 更多的filter等

首先, 我们需要在工程的依赖中引入LogBack, 在pom.xml中添加如下依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.4</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.4</version>
</dependency>

import完依赖后, 在LogController中添加Logback的使用

package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogController {

    @RequestMapping(value = "/log", method = RequestMethod.GET)
    @ResponseBody
    public String log() {
        Logger logger = LoggerFactory.getLogger(LogController.class);
        logger.info("slf4j info");
        logger.warn("slf4j warn");
        logger.error("slf4j error");
        return "log";
    }

}

我们再次访问该接口(/log), 此时Idea控制台打印输出如下

spring-library-json-log_04.png

这里打印输出的配色, 是因为安装了Idea插件GrepConsole

那么我们如何配置Log输出的级别, 以及打印Log至指定文件中呢?

答案就是通过LogBack的配置文件logback.xml来设置

在resources文件夹下创建logback.xml文件(LogBack会自动寻找该目录下的配置文件)

spring-library-json-log_05.png

logback.xml的详细配置如下

<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="10 seconds">

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>
                [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/SpringLibraryJsonLog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>64 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>

        <!-- Safely log to the same file from multiple JVMs .Degrades performance! -->
        <prudent>true</prudent>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                [ %-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
            </pattern>
            <charset>GBK</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- Enable FILE and STDOUT appenders for all log messages.
         By default, only log at level INFO and above. -->
    <root level="DEBUG">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </root>

    <!-- For loggers in the these namespaces, log at all levels. -->
    <logger name="pedestal" level="ALL"/>
    <logger name="hammock-cafe" level="ALL"/>
    <logger name="user" level="ALL"/>
</configuration>

重新运行工程, 再次访问该接口(/log), 此时Idea控制台打印输出如下

spring-library-json-log_06.png

(上述logback.xml文件, 配置了输出到console的log级别为INFO及以上)

同时, 在工程的根目录的logs文件夹下, 会有输出到文件的log信息

[ WARN ] [2016-08-19 18:39:42] com.example.LogController [18] - slf4j warn
[ ERROR] [2016-08-19 18:39:42] com.example.LogController [19] - slf4j error

(上述logback.xml文件, 配置了输出到文件的log级别为WARN及以上)

小结

本文先解释了Spring开发中常用的JSON和Log库

后续还有更多更精彩的内容(其他常用库, 以及部署等), 敬请期待, 如果有什么问题和指正, 欢迎留言

修订

修订于2016年8月28日

Spring中现在已经默认集成了Jackson做序列化操作

关于Jackson和FastJSON的对比和争论大家可以自行"谷哥", 本文就不掺和了

我们来看下使用Jackson如何实现上述FastJSON的需求

首先是Bean的定义

package com.example;

import com.fasterxml.jackson.annotation.JsonGetter;

public class Customer2 {

    private String firstName;
    private String lastName;

    public Customer2() {}

    public Customer2(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @JsonGetter("last")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Override
    public String toString() {
        return String.format("Customer[firstName='%s', lastName='%s']", firstName, lastName);
    }

}

接着是使用Jackson

ObjectMapper mapper = new ObjectMapper();
try {
    String json = mapper.writeValueAsString(new Customer2("xiao", "jackson"));
    logger.info(json);
} catch (JsonProcessingException e) {
    logger.error("error");
}

打印输出如下

{
  "firstName": "xiao",
  "last": "jackson"
}

关于Jackson的更过解释, 可以参考Jackson Annotations

更多文章, 请支持我的个人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容