Spring boot如何配置請(qǐng)求的入?yún)⒑统鰠son數(shù)據(jù)格式
這篇文章主要介紹了spring boot如何配置請(qǐng)求的入?yún)⒑统鰠son數(shù)據(jù)格式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
請(qǐng)求入?yún)?shù)據(jù)格式配置,以日期格式為例:
編寫(xiě)日期編輯器類(lèi):
import first.zxz.tools.DateUtil;
import java.beans.PropertyEditorSupport;
/**
* 日期編輯器
*
* @author zhangxz
* @date 2019-11-12 20:01
*/
public class DateEditor extends PropertyEditorSupport {
/**
* 是否將null轉(zhuǎn)換為空字符串
*/
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));
}
}
}
其中用到的日期工具類(lèi)如下:
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為正則表達(dá)式,value為對(duì)應(yīng)的日期格式
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);
}
//提示語(yǔ):所有可用的日期格式
public static final String ALL_USABLE_DATE_FORMATS = DATE_REGEX_FORMATTER_MAP.values().toString() + ",以及時(shí)間戳;";
/**
* 根據(jù)輸入的字符串,進(jìn)行格式化,并輸入日期數(shù)據(jù)
* 注意:格式化之前,會(huì)進(jìn)行null和空字符串過(guò)濾;格式化時(shí),會(huì)去除字符串兩端的空字符串
*
* @param formattedDateStr 日期字符串?dāng)?shù)據(jù)
* @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;
/**
* 配置請(qǐng)求 bean數(shù)據(jù)接收格式,例如date格式
*
* @author zhangxz
* @date 2019-11-12 19:56
*/
@Configuration
public class WebBindingInitializerConfig {
/**
* 配置請(qǐng)求入?yún)?shù)據(jù)格式,參考{@link simple.proj.zxz.play.config.editor.DateEditor}
*
* @param mvcConversionService mvc版本業(yè)務(wù)
* @param mvcValidator mvc校驗(yàn)器
* @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;
}
}
入?yún)⒌娜掌跀?shù)據(jù)格式配置完成,可以接收的日期格式在日期工具類(lèi)可以看到,有以下幾種:yyyy-mm-dd,時(shí)間戳,yyyy-mm-dd hh:mm:ss等。
請(qǐng)求出參格式配置,包括空字符串,空數(shù)組,以及日期格式化輸出
編寫(xiě)空字符串序列器:
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("");
}
}
編寫(xiě)空數(shù)組序列器
/**
* 空數(shù)組或集合序列器
*
* @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();
}
}
編寫(xiě)日期序列器
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 {
/**
* 日期序列化方法,返回時(shí)間戳格式
*
* @param o 數(shù)值
* @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());
}
}
編寫(xiě)總序列器
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 {
//空數(shù)組
private JsonSerializer _nullArraySerializer = new NullArraySerializer();
//空字符串
private JsonSerializer _nullStringSerializer = new NullStringSerializer();
//日期類(lèi)型
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 {
/**
* 出參數(shù)據(jù)格式配置,參考類(lèi) {@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;
}
}
請(qǐng)求出參配置完成,出參格式如下:null的字符串輸出為空字符串,null的數(shù)組輸出為空數(shù)組,date數(shù)據(jù)格式輸出為時(shí)間戳。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot?配置?Hikari?數(shù)據(jù)庫(kù)連接池的操作代碼
數(shù)據(jù)庫(kù)連接池是一個(gè)提高程序與數(shù)據(jù)庫(kù)的連接的優(yōu)化,連接池它主要作用是提高性能、節(jié)省資源、控制連接數(shù)、連接管理等操作,這篇文章主要介紹了SpringBoot配置Hikari數(shù)據(jù)庫(kù)連接池,需要的朋友可以參考下2023-09-09
Java反射 PropertyDescriptor類(lèi)案例詳解
這篇文章主要介紹了Java反射 PropertyDescriptor類(lèi)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Spring事件監(jiān)聽(tīng)機(jī)制之@EventListener實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Spring事件監(jiān)聽(tīng)機(jī)制之@EventListener實(shí)現(xiàn)方式詳解,ApplicationContext的refresh方法還是初始化了SimpleApplicationEventMulticaster,發(fā)送事件式還是先獲取ResolvableType類(lèi)型,再獲取發(fā)送監(jiān)聽(tīng)列表,需要的朋友可以參考下2023-12-12
Java 批量獲取地址間距離工具(支持中轉(zhuǎn)站)
本文主要介紹了Java批量獲取地址間距離,獲取兩個(gè)地址間距離,實(shí)現(xiàn)方式比較多,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行
這篇文章主要介紹了Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java中的Optional使用詳細(xì)說(shuō)明
這篇文章主要介紹了Java中的Optional使用詳細(xì)說(shuō)明,Optional就是相當(dāng)于把對(duì)象包了一層,將判斷空的部分代碼給單獨(dú)抽出來(lái)了,主要就是為了避免null引起的部分問(wèn)題,需要的朋友可以參考下2023-11-11
Java16新特性record類(lèi)使用細(xì)節(jié)示例詳解
這篇文章主要為大家介紹了Java16新特性record類(lèi)使用細(xì)節(jié)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Spring事務(wù)失效的場(chǎng)景梳理總結(jié)
實(shí)際項(xiàng)目開(kāi)發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2023-02-02

