Version: Next

数据转换

Forest支持JSON、XML、普通文本等数据转换形式。不需要接口调用者自己写具体的数据转换代码。

序列化

几乎所有数据格式的转换都包含序列化和反序列化,Forest的数据转换同样如此。

Forest中对数据进行序列化可以通过指定contentType属性或Content-Type头指定内容格式。

@Request(
url = "http://localhost:8080/hello/user",
type = "post",
contentType = "application/json" // 指定contentType为application/json
)
String postJson(@Body MyUser user); // 自动将user对象序列化为JSON格式

同理,指定为application/xml会将参数序列化为XML格式,text/plain则为文本,默认的application/x-www-form-urlencoded则为表格格式。

反序列化

HTTP请求响应后返回结果的数据同样需要转换,Forest则会将返回结果自动转换为您通过方法返回类型指定对象类型。这个过程就是反序列化,您可以通过dataType指定返回数据的反序列化格式。

@Request(
url = "http://localhost:8080/data",
dataType = "json" // 指定dataType为json,将按JSON格式反序列化数据
)
Map getData(); // 请求响应的结果将被转换为Map类型对象

更换转换器:SpringBoot中配置

forest:
max-connections: 5000
max-route-connections: 5500
timeout: 50
connect-timeout: 4000
log-enabled: true
log-request: false
log-response-status: false
log-response-content: true
retry-count: 0
# 转换器配置,支持 json, xml, text, binary 四种数据类型的配置
converters:
json:
type: com.dtflys.forest.converter.json.ForestGsonConverter
# 转换器参数配置,参数名与转换器getter/setter属性名一一对应
parameters:
# JSON数据转换器的全局日期格式化配置
dateFormat: yyyy/MM/dd hh:mm:ss

更换转换器:代码配置

在Forest中已定义好默认的转换器,比如JSON的默认转为器为ForestFastjsonConverter,即FastJson的转换器。你也可以通过如下代码进行更换:

@Autowrired
private ForestConfiguration forestConfiguration;
...
// 更换JSON转换器为FastJson
forestConfiguration.setJsonConverter(new ForestFastjsonConverter());
// 更换JSON转换器为Jackson
forestConfiguration.setJsonConverter(new ForestJacksonConverter());
// 更换JSON转换器Gson
forestConfiguration.setJsonConverter(new ForestGsonConverter());
// 更换XML转换器JAXB
forestConfiguration.getConverterMap().put(ForestDataType.XML, new ForestJaxbConverter());

自定义转换器

在Forest中,每个转换类型都对应一个转换器对象,比如JSON格式的转换器有com.dtflys.forest.converter.json.ForestFastjsonConvertercom.dtflys.forest.converter.json.ForestGsonConvertercom.dtflys.forest.converter.json.ForestJacksonConverter三种,分别是基于FastJsonGsonJackson三种不同的JSON序列化框架。

当然,您也可以自定义自己的转换器,以适应自己项目的需要。只需三步便可完成自定义扩展转换器。

第一步. 定义一个转换器类,并实现com.dtflys.forest.converter.ForestConverter接口

/**
* 自定义一个Protobuf的转换器,并实现ForestConverter接口下的convertToJavaObject方法
*/
public class MyProtobufConverter implements ForestConverter {
<T> T convertToJavaObject(String source, Class<T> targetType) {
// 将字符串参数source转换成目标Class对象
}
<T> T convertToJavaObject(String source, Type targetType) {
// 将字符串参数source转换成目标Type(可能是一个泛型类型)对象
}
}

第二步. 注册您定义好的转换器类到ForestConfiguration

@Autowrired
private ForestConfiguration forestConfiguration;
...
// 设置文本转换器
forestConfiguration.getConverterMap().put(ForestDataType.TEXT, new MyProtobufConverter());
// 设置二进制转换器
forestConfiguration.getConverterMap().put(ForestDataType.BINARY, new MyProtobufConverter());
// 设置二进制转换器
forestConfiguration.getConverterMap().put(ForestDataType.BINARY, new MyProtobufConverter());

JSON转换器和XML转换器比较特殊,需要 implements 的类不是 ForestConverter

/**
* JSON转换器需要实现 ForestJsonConverter 接口
*/
public class MyJsonConverter implements ForestJsonConverter {
... ...
}
/**
* XML转换器需要实现 ForestXmlConverter 接口
*/
public class MyXmlConverter implements ForestXmlConverter {
... ...
}

注册到配置中

// 设置JSON转换器
forestConfiguration.setJsonConverter(new MyJsonConverter());
// 设置XML转换器
forestConfiguration.getConverterMap().put(ForestDataType.XML, new MyXmlConverter());
Last updated on