java入参出参_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 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 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 changeProperties(SerializationConfig config, BeanDescription beanDesc,

List 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数据格式输出为时间戳。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。


版权声明:本文为weixin_42565652原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。