Spring boot如何配置请求的入参和出参json数据格式
这篇文章主要介绍了springboot如何配置请求的入参和出参json数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
请求入参数据格式配置,以日期格式为例:
编写日期编辑器类:
importfirst.zxz.tools.DateUtil;
importjava.beans.PropertyEditorSupport;
/**
*日期编辑器
*
*@authorzhangxz
*@date2019-11-1220:01
*/
publicclassDateEditorextendsPropertyEditorSupport{
/**
*是否将null转换为空字符串
*/
privatefinalbooleannullAsEmpty;
publicDateEditor(){
this(true);
}
publicDateEditor(booleannullAsEmpty){
this.nullAsEmpty=nullAsEmpty;
}
@Override
publicvoidsetAsText(Stringtext){
if(text==null){
if(nullAsEmpty){
setValue("");
}else{
setValue(null);
}
}else{
setValue(DateUtil.parse(text));
}
}
}
其中用到的日期工具类如下:
publicclassDateUtil{
privatestaticfinalStringDATE_FORMAT_1="yyyy-MM-dd";
privatestaticfinalStringDATE_FORMAT_2="yyyy/MM/dd";
privatestaticfinalStringDATE_FORMAT_3="yyyyMMdd";
privatestaticfinalStringDATE_TIME_FORMAT_1=DATE_FORMAT_1+"HH:mm:ss";
privatestaticfinalStringDATE_TIME_FORMAT_2=DATE_FORMAT_2+"HH:mm:ss";
privatestaticfinalStringDATE_TIME_FORMAT_3=DATE_FORMAT_3+"HHmmss";
//key为正则表达式,value为对应的日期格式
privatestaticfinalHashMapDATE_REGEX_FORMATTER_MAP=newHashMap<>();
static{
DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_1,DATE_FORMAT_1);
DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_2,DATE_FORMAT_2);
DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_3,DATE_FORMAT_3);
DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_TIME_1,DATE_TIME_FORMAT_1);
DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_TIME_2,DATE_TIME_FORMAT_2);
DATE_REGEX_FORMATTER_MAP.put(DateRegexConst.DATE_TIME_3,DATE_TIME_FORMAT_3);
}
//提示语:所有可用的日期格式
publicstaticfinalStringALL_USABLE_DATE_FORMATS=DATE_REGEX_FORMATTER_MAP.values().toString()+",以及时间戳;";
/**
*根据输入的字符串,进行格式化,并输入日期数据
*注意:格式化之前,会进行null和空字符串过滤;格式化时,会去除字符串两端的空字符串
*
*@paramformattedDateStr日期字符串数据
*@returnjava.util.Date
*@authorZxz
*@date2019/11/615:07
**/
publicstaticDateparse(StringformattedDateStr){
if(formattedDateStr==null||formattedDateStr.trim().length()<=0){
thrownewStringEmptyException();
}
for(Map.Entryentry:DATE_REGEX_FORMATTER_MAP.entrySet()){
if(formattedDateStr.trim().matches(entry.getKey())){
SimpleDateFormatsimpleDateFormat=newSimpleDateFormat(entry.getValue());
try{
returnsimpleDateFormat.parse(formattedDateStr.trim());
}catch(ParseExceptione){
e.printStackTrace();
thrownewDateFormatException();
}
}
}
try{
LongaLong=Long.valueOf(formattedDateStr);
returnnewDate(aLong);
}catch(NumberFormatExceptione){
//格式不匹配
thrownewDateFormatException();
}
}
}
把编辑器加入web的绑定初始化配置:
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.format.support.FormattingConversionService;
importorg.springframework.validation.Validator;
importorg.springframework.web.bind.support.ConfigurableWebBindingInitializer;
importsimple.proj.zxz.play.config.editor.DateEditor;
importjava.util.Date;
/**
*配置请求bean数据接收格式,例如date格式
*
*@authorzhangxz
*@date2019-11-1219:56
*/
@Configuration
publicclassWebBindingInitializerConfig{
/**
*配置请求入参数据格式,参考{@linksimple.proj.zxz.play.config.editor.DateEditor}
*
*@parammvcConversionServicemvc版本业务
*@parammvcValidatormvc校验器
*@returnorg.springframework.web.bind.support.ConfigurableWebBindingInitializer
*@authorzhangxz
*@date2019/11/1310:40
*/
@Bean
publicConfigurableWebBindingInitializerconfigurableWebBindingInitializer(FormattingConversionServicemvcConversionService,ValidatormvcValidator){
ConfigurableWebBindingInitializerinitializer=newConfigurableWebBindingInitializer();
initializer.setConversionService(mvcConversionService);
initializer.setValidator(mvcValidator);
initializer.setPropertyEditorRegistrar(propertyEditorRegistry->{
//PropertyEditor非线程安全
propertyEditorRegistry.registerCustomEditor(Date.class,newDateEditor());
});
returninitializer;
}
}
入参的日期数据格式配置完成,可以接收的日期格式在日期工具类可以看到,有以下几种:yyyy-mm-dd,时间戳,yyyy-mm-ddhh:mm:ss等。
请求出参格式配置,包括空字符串,空数组,以及日期格式化输出
编写空字符串序列器:
importcom.fasterxml.jackson.core.JsonGenerator;
importcom.fasterxml.jackson.core.JsonProcessingException;
importcom.fasterxml.jackson.databind.JsonSerializer;
importcom.fasterxml.jackson.databind.SerializerProvider;
importjava.io.IOException;
/**
*空字符串序列器
*
*@authorzhangxz
*@date2019-11-1222:05
*/
publicclassNullStringSerializerextendsJsonSerializer{
@Override
publicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)
throwsIOException,JsonProcessingException{
jsonGenerator.writeString("");
}
}
编写空数组序列器
/**
*空数组或集合序列器
*
*@authorzhangxz
*@date2019-11-1222:04
*/
publicclassNullArraySerializerextendsJsonSerializer{
@Override
publicvoidserialize(Objectvalue,JsonGeneratorjgen,SerializerProviderprovider)throwsIOException,JsonProcessingException{
jgen.writeStartArray();
jgen.writeEndArray();
}
}
编写日期序列器
importcom.fasterxml.jackson.core.JsonGenerator;
importcom.fasterxml.jackson.databind.JsonSerializer;
importcom.fasterxml.jackson.databind.SerializerProvider;
importjava.io.IOException;
importjava.util.Date;
/**
*日期序列器
*
*@authorzhangxz
*@date2019-11-1223:01
*/
publicclassDateSerializerextendsJsonSerializer{
/**
*日期序列化方法,返回时间戳格式
*
*@paramo数值
*@paramjsonGeneratorjson生成器
*@paramserializerProvider序列器
*@authorzhangxz
*@date2019/11/1310:41
*/
@Override
publicvoidserialize(Objecto,JsonGeneratorjsonGenerator,SerializerProviderserializerProvider)throwsIOException{
jsonGenerator.writeNumber(((Date)o).getTime());
}
}
编写总序列器
importcom.fasterxml.jackson.databind.BeanDescription;
importcom.fasterxml.jackson.databind.JsonSerializer;
importcom.fasterxml.jackson.databind.SerializationConfig;
importcom.fasterxml.jackson.databind.ser.BeanPropertyWriter;
importcom.fasterxml.jackson.databind.ser.BeanSerializerModifier;
importjava.util.Collection;
importjava.util.Date;
importjava.util.List;
/**
*总序列器
*
*@authorzhangxz
*@date2019-11-1222:07
*/
publicclassGeneralSerializerextendsBeanSerializerModifier{
//空数组
privateJsonSerializer_nullArraySerializer=newNullArraySerializer();
//空字符串
privateJsonSerializer_nullStringSerializer=newNullStringSerializer();
//日期类型
privateJsonSerializerdateSerializer=newDateSerializer();
@Override
publicListchangeProperties(SerializationConfigconfig,BeanDescriptionbeanDesc,
ListbeanProperties){
for(BeanPropertyWriterbeanProperty:beanProperties){
if(isArrayType(beanProperty)){
beanProperty.assignNullSerializer(this._nullArraySerializer);
}elseif(isStringType(beanProperty)){
beanProperty.assignNullSerializer(this._nullStringSerializer);
}elseif(isDateType(beanProperty)){
beanProperty.assignSerializer(this.dateSerializer);
}
}
returnbeanProperties;
}
privatebooleanisStringType(BeanPropertyWriterwriter){
Classclazz=writer.getType().getRawClass();
returnclazz==String.class;
}
privatebooleanisDateType(BeanPropertyWriterwriter){
returnDate.class==writer.getType().getRawClass();
}
privatebooleanisArrayType(BeanPropertyWriterwriter){
Classclazz=writer.getType().getRawClass();
returnclazz.isArray()||Collection.class.isAssignableFrom(clazz);
}
}
把总序列器加入web配置中:
importcom.fasterxml.jackson.databind.ObjectMapper;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
importsimple.proj.zxz.play.config.serializer.GeneralSerializer;
/**
*@description:配置jackson序列器
*@author:zhangxz
*@create:2019-11-1222:02
*/
@Configuration
publicclassJacksonConfig{
/**
*出参数据格式配置,参考类{@linksimple.proj.zxz.play.config.serializer.GeneralSerializer}
*
*@returnorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter
*@authorzhangxz
*@date2019/11/1310:34
*/
@Bean
publicMappingJackson2HttpMessageConvertermappingJacksonHttpMessageConverter(){
finalMappingJackson2HttpMessageConverterconverter=newMappingJackson2HttpMessageConverter();
ObjectMappermapper=converter.getObjectMapper();
mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(newGeneralSerializer()));
returnconverter;
}
}
请求出参配置完成,出参格式如下:null的字符串输出为空字符串,null的数组输出为空数组,date数据格式输出为时间戳。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。