web开发 之 Spring常用第三方库(FastJSON Lo
目录
引言
之前两篇文章介绍了Spring以及Spring中MongoDB的使用
web开发 之 Spring + IntelliJ Idea
本文介绍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.pnglogback.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
更多文章, 请支持我的个人博客