编程技术Android开发Android知识

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

2016-08-21  本文已影响538人  诺之林

目录

引言

之前两篇文章介绍了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

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

上一篇下一篇

猜你喜欢

热点阅读