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.Entry entry: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, List beanProperties){ 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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。