Spring boot如何配置请求的入参和出参json数据格式
作者:zhangxuezhi 发布时间:2023-10-23 17:27:48
标签:spring,boot,配置,请求,参,json
这篇文章主要介绍了spring boot如何配置请求的入参和出参json数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
请求入参数据格式配置,以日期格式为例:
编写日期编辑器类:
import first.zxz.tools.DateUtil;
import java.beans.PropertyEditorSupport;
/**
* 日期编辑器
*
* @author zhangxz
* @date 2019-11-12 20:01
*/
public class DateEditor extends PropertyEditorSupport {
/**
* 是否将null转换为空字符串
*/
private final boolean nullAsEmpty;
public DateEditor() {
this(true);
}
public DateEditor(boolean nullAsEmpty) {
this.nullAsEmpty = nullAsEmpty;
}
@Override
public void setAsText(String text) {
if (text == null) {
if (nullAsEmpty) {
setValue("");
} else {
setValue(null);
}
} else {
setValue(DateUtil.parse(text));
}
}
}
其中用到的日期工具类如下:
public class DateUtil {
private static final String DATE_FORMAT_1 = "yyyy-MM-dd";
private static final String DATE_FORMAT_2 = "yyyy/MM/dd";
private static final String DATE_FORMAT_3 = "yyyyMMdd";
private static final String DATE_TIME_FORMAT_1 = DATE_FORMAT_1 + " HH:mm:ss";
private static final String DATE_TIME_FORMAT_2 = DATE_FORMAT_2 + " HH:mm:ss";
private static final String DATE_TIME_FORMAT_3 = DATE_FORMAT_3 + "HHmmss";
//key为正则表达式,value为对应的日期格式
private static final HashMap<String, String> DATE_REGEX_FORMATTER_MAP = new HashMap<>();
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);
}
//提示语:所有可用的日期格式
public static final String ALL_USABLE_DATE_FORMATS = DATE_REGEX_FORMATTER_MAP.values().toString() + ",以及时间戳;";
/**
* 根据输入的字符串,进行格式化,并输入日期数据
* 注意:格式化之前,会进行null和空字符串过滤;格式化时,会去除字符串两端的空字符串
*
* @param formattedDateStr 日期字符串数据
* @return java.util.Date
* @author Zxz
* @date 2019/11/6 15:07
**/
public static Date parse(String formattedDateStr) {
if (formattedDateStr == null || formattedDateStr.trim().length() <= 0) {
throw new StringEmptyException();
}
for (Map.Entry<String, String> entry : DATE_REGEX_FORMATTER_MAP.entrySet()) {
if (formattedDateStr.trim().matches(entry.getKey())) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(entry.getValue());
try {
return simpleDateFormat.parse(formattedDateStr.trim());
} catch (ParseException e) {
e.printStackTrace();
throw new DateFormatException();
}
}
}
try {
Long aLong = Long.valueOf(formattedDateStr);
return new Date(aLong);
} catch (NumberFormatException e) {
//格式不匹配
throw new DateFormatException();
}
}
}
把编辑器加入web的绑定初始化配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.validation.Validator;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
import simple.proj.zxz.play.config.editor.DateEditor;
import java.util.Date;
/**
* 配置请求 bean数据接收格式,例如date格式
*
* @author zhangxz
* @date 2019-11-12 19:56
*/
@Configuration
public class WebBindingInitializerConfig {
/**
* 配置请求入参数据格式,参考{@link simple.proj.zxz.play.config.editor.DateEditor}
*
* @param mvcConversionService mvc版本业务
* @param mvcValidator mvc校验器
* @return org.springframework.web.bind.support.ConfigurableWebBindingInitializer
* @author zhangxz
* @date 2019/11/13 10:40
*/
@Bean
public ConfigurableWebBindingInitializer configurableWebBindingInitializer(FormattingConversionService mvcConversionService, Validator mvcValidator) {
ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
initializer.setConversionService(mvcConversionService);
initializer.setValidator(mvcValidator);
initializer.setPropertyEditorRegistrar(propertyEditorRegistry -> {
//PropertyEditor 非线程安全
propertyEditorRegistry.registerCustomEditor(Date.class, new DateEditor());
});
return initializer;
}
}
入参的日期数据格式配置完成,可以接收的日期格式在日期工具类可以看到,有以下几种:yyyy-mm-dd,时间戳,yyyy-mm-dd hh:mm:ss等。
请求出参格式配置,包括空字符串,空数组,以及日期格式化输出
编写空字符串序列器:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
* 空字符串序列器
*
* @author zhangxz
* @date 2019-11-12 22:05
*/
public class NullStringSerializer extends JsonSerializer {
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException, JsonProcessingException {
jsonGenerator.writeString("");
}
}
编写空数组序列器
/**
* 空数组或集合序列器
*
* @author zhangxz
* @date 2019-11-12 22:04
*/
public class NullArraySerializer extends JsonSerializer {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartArray();
jgen.writeEndArray();
}
}
编写日期序列器
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Date;
/**
* 日期序列器
*
* @author zhangxz
* @date 2019-11-12 23:01
*/
public class DateSerializer extends JsonSerializer {
/**
* 日期序列化方法,返回时间戳格式
*
* @param o 数值
* @param jsonGenerator json生成器
* @param serializerProvider 序列器
* @author zhangxz
* @date 2019/11/13 10:41
*/
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeNumber(((Date) o).getTime());
}
}
编写总序列器
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* 总序列器
*
* @author zhangxz
* @date 2019-11-12 22:07
*/
public class GeneralSerializer extends BeanSerializerModifier {
//空数组
private JsonSerializer _nullArraySerializer = new NullArraySerializer();
//空字符串
private JsonSerializer _nullStringSerializer = new NullStringSerializer();
//日期类型
private JsonSerializer dateSerializer = new DateSerializer();
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
List<BeanPropertyWriter> beanProperties) {
for (BeanPropertyWriter beanProperty : beanProperties) {
if (isArrayType(beanProperty)) {
beanProperty.assignNullSerializer(this._nullArraySerializer);
} else if (isStringType(beanProperty)) {
beanProperty.assignNullSerializer(this._nullStringSerializer);
} else if (isDateType(beanProperty)) {
beanProperty.assignSerializer(this.dateSerializer);
}
}
return beanProperties;
}
private boolean isStringType(BeanPropertyWriter writer) {
Class clazz = writer.getType().getRawClass();
return clazz == String.class;
}
private boolean isDateType(BeanPropertyWriter writer) {
return Date.class == writer.getType().getRawClass();
}
private boolean isArrayType(BeanPropertyWriter writer) {
Class clazz = writer.getType().getRawClass();
return clazz.isArray() || Collection.class.isAssignableFrom(clazz);
}
}
把总序列器加入web配置中:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import simple.proj.zxz.play.config.serializer.GeneralSerializer;
/**
* @description: 配置jackson 序列器
* @author: zhangxz
* @create: 2019-11-12 22:02
*/
@Configuration
public class JacksonConfig {
/**
* 出参数据格式配置,参考类 {@link simple.proj.zxz.play.config.serializer.GeneralSerializer}
*
* @return org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
* @author zhangxz
* @date 2019/11/13 10:34
*/
@Bean
public MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter() {
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = converter.getObjectMapper();
mapper.setSerializerFactory(mapper.getSerializerFactory().withSerializerModifier(new GeneralSerializer()));
return converter;
}
}
请求出参配置完成,出参格式如下:null的字符串输出为空字符串,null的数组输出为空数组,date数据格式输出为时间戳。
来源:https://www.cnblogs.com/zhangxuezhi/p/11847773.html


猜你喜欢
- 介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求
- 最近在用ssm框架做一个管理系统,做到登录验证时,使用了下面的代码生成图片验证码,最终的效果如下图。Java类public class Ra
- Vector简介ArrayList 和 Vector 其实大同小异,基本结构都差不多,但是一些细节上有区别:比如线程安全与否,扩容的大小等,
- 第1部分 HashMap介绍HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap
- 学习过java基础,最近趁着大量课余时间想学习Android开发。百度很多资料Android studio,由Google开发的开发工具,那
- EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。ehcach
- 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位。当投递了无数份简历后,终于收到了一个
- Transactional事务的使用及注意Transactional的事务使用,主要引用两个包中的Bean,一个是jpa的javax.tra
- static 表示静态,它可以修饰属性,方法和代码块。1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这
- 解决方案1:禁用缓存,前一次使用的方法,在电脑上各浏览器都没问题,但在ipad、安卓手机上仍有问题解决方案2:禁用浏览器后退键 javasc
- 一、导论java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家
- Process类的作用是对系统进程进行管理,我们使用Process类中的一些方法结合Winform开发个简单的进程管理器: 在使用Proce
- 一 .前言某年某月某天,同事说需要一个文件排他锁功能,需求如下:(1)写操作是排他属性(2)适用于同一进程的多线程/也适用于多进程的排他操作
- 因为目前工程无法使用第三方,只能搞一个 * 缓存了 * 缓存分为内存缓存,本地缓存,网络缓存;缓存的步骤依次是网络,内存,本地,然后取的顺序为内
- xUtils简介xUtils 包含了很多实用的android工具。xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),
- 一、简介WorkManager 用于处理 Android 后台任务。我们只需要设置好任务内容、何时执行,剩下的工作就可以完全交给系统处理。它
- 一、搭建步骤1、导入jar包、创建项目包结构2、在web.xml中配置前端控制器3、编写springMvc核心配置文件4、编写pojo类和C
- 现在很多电脑提供了蓝牙支持,很多笔记本网卡也集成了蓝牙功能,也可以采用USB蓝牙方便的连接手机等蓝牙设备进行通信。操作蓝牙要使用类库InTh
- 今天我们来讨论如何在项目开发中优雅地使用RocketMQ。本文分为三部分,第一部分实现SpringBoot与RocketMQ的整合,第二部分
- 在Android开发中,我们不光可以使用已有的实现方式,而且,我们还可以利用Android这个智能手机平台,实现一些比较有特色的功能。本篇文