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

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

(0)

相关推荐

  • SpringBoot2.1.3修改tomcat参数支持请求特殊符号问题

    最近遇到一个问题,比如GET请求中,key,value中带有特殊符号,请求会报错,见如下URL: http://xxx.xxx.xxx:8081/aaa?key1=val1&a.[].id=123&b=a[1] 现在,我们进入boot启动类,添加如下代码即可: public class DemoApp { public static void main(String[] args) { SpringApplication.run(DemoApp.class, args); } @Bean

  • Spring Boot接收单个String入参的解决方法

    前言 接受参数是我们在日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于Spring Boot接收单个String入参之解决方案的相关内容,下面话不多说了,来一起看看详细的介绍吧 场景: 在做接口时,有的时候,接口入参只需要一个参数,如果将一个参数封装成一个对象很麻烦,故有了以下方式: 思路: spring自带的参数解析器貌似是不具备这个能力的,所有自定义 方式方法: 1.定义一个注解 @Target(ElementType.PARAMETER) @Retention(Retent

  • Spring Boot实现通用的接口参数校验

    本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP ,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在实体类上添加注解,但对于不同的方法,所应用的校验规则也是不一样的,例如有一个 AccountVO 实体: public class AccountVO { private String name; // 姓名 private Integer age; // 年龄 } 假设存在这样一个业务:用户注册时需要填写姓名和年龄,用户登陆时只需要填写姓名就可以了.那

  • Spring Boot + Vue 前后端分离开发之前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个项目本身也停止维护,目前建议使用的方案是 axios.今天松哥就带大家来看看 axios 的使用. axios 引入 axios 使用步骤很简单,首先在前端项目中,引入 axios: npm install axios -S 装好之后,按理说可以直接使用了,但是,一般在生产环境中,我们都需要对网络请

  • 基于spring boot 的配置参考大全(推荐)

    如下所示: # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # =============================

  • 如何使用Spring Boot ApplicationRunner解析命令行中的参数

    使用Spring提供的CommandLineRunner接口可以实现了一个命令行应用程序.但是,参数/选项/参数处理却不是那么好.幸运的是,有一种更好的方法可以使用Spring Boot编写命令行应用程序,并且还可以使用ApplicationRunner接口进行解析. 在我们开始快速说明之前.在这两种情况下,无论是CommandLineRunner还是ApplicationRunner,都始终支持Spring的属性处理.我们可以像往常一样使用@Value注释注入值. 完整的工作源代码在这里 首先

  • 详解Spring Boot Web项目之参数绑定

    一.@RequestParam 这个注解用来绑定单个请求数据,既可以是url中的参数,也可以是表单提交的参数和上传的文件 它有三个属性,value用于设置参数名,defaultValue用于对参数设置默认值,required为true时,如果参数为空,会报错 好,下面展示具体例子: 首先是vm: <h1>param1:${param1}</h1> <h1>param2:${param2}</h1> 好吧,就为了展示两个参数 第一种情况: @RequestMa

  • Spring Boot/VUE中路由传递参数的实现代码

    在路由时传递参数,一般有两种形式,一种是拼接在url地址中,另一种是查询参数.如:http://localhost:8080/router/tang/101?type=spor&num=12.下面根据代码看一下,VUE 和 Spring Boot 中各自是如何处理传递和接受参数的. Spring Boot package com.tang.demo1.controller; import org.springframework.web.bind.annotation.*; @RestContro

  • Spring boot如何配置请求的入参和出参json数据格式

    这篇文章主要介绍了spring boot如何配置请求的入参和出参json数据格式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 请求入参数据格式配置,以日期格式为例: 编写日期编辑器类: import first.zxz.tools.DateUtil; import java.beans.PropertyEditorSupport; /** * 日期编辑器 * * @author zhangxz * @date 2019-11-12 20:01

  • 使用Spring Boot AOP处理方法的入参和返回值

    前言 IOC和AOP是Spring 中最重要的两个模块.这里练习一下如何使用Spring Boot AOP处理方法的入参和返回值. Spring AOP的简单介绍: AOP(Aspect-Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任(例如事务处理.⽇志管理.权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于提高系统的可拓展性和可维护性.

  • Spring boot多线程配置方法

    本文实例为大家分享了Spring boot多线程配置的具体代码,供大家参考,具体内容如下 1.配置线程配置类 package test; import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.ComponentScan; import o

  • Spring Boot Logback配置日志过程解析

    这篇文章主要介绍了Spring Boot Logback配置日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 出于性能等原因,Logback 目前是springboot应用日志的标配: 当然有时候在生产环境中也会考虑和三方中间件采用统一处理方式. 配置时考虑点 支持日志路径,日志level等配置 日志控制配置通过application.yml下发 按天生成日志,当天的日志>50MB回滚 最多保存10天日志 生成的日志中Pattern自

  • Spring boot Thymeleaf配置国际化页面详解

    目录 1.编写多语言国际化配置文件 2.编写配置文件 3.定制区域信息解析器 4.页面国际化使用 5.整合效果测试 1.编写多语言国际化配置文件 在项目的类路径resources下创建名称为i18n的文件夹,并在该文件夹中根据需要编写对应的多语言国际化文件login.properties.login_zh_CN.properties和login_en_US.properties文件 login.properties login.tip=请登录login.username=用户名login.pas

  • 详解Spring Boot 属性配置和使用

    spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot 支持多种外部配置方式 这些方式优先级如下: 命令行参数 来自java:comp/env的JNDI属性 Java系统属性(System.getProperties()) 操作系统环境变量 RandomValuePropertySource配置的random.*属性值 jar包外部的application-{profile}.propert

  • spring boot 日志配置详解

    最近在学习spring boot框架的路上,今日看了一下spring boot日志配置,顺便留个笔记记录一下. 1.新建logback.xml文件 内容如下: <!-- Logback configuration. See http://logback.qos.ch/manual/index.html --> <configuration scan="true" scanPeriod="10 seconds"> <include res

  • 浅谈Spring Boot 属性配置和自定义属性配置

    在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配置足以满足正常的功能开发. 如果需要修改自定义修改默认配置,spring boot 提供了很简便的方法,只需要在application.properties 中添加修改相应的配置.(spring boot启动的时候会读取application.properties这份默认配置) 一.修改默认配置 例

  • Spring Boot Security配置教程

    1.简介 在本文中,我们将了解Spring Boot对spring Security的支持. 简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它. 2.默认Security设置 为了增加Spring Boot应用程序的安全性,我们需要添加安全启动器依赖项: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

随机推荐