首页 > 其他分享 >【springboot开发】SpringBoot中出入参增强的5种方法 : 加解密、脱敏、格式转换、时间时区处理

【springboot开发】SpringBoot中出入参增强的5种方法 : 加解密、脱敏、格式转换、时间时区处理

时间:2024-11-21 09:56:00浏览次数:1  
标签:springboot 自定义 使用 加解密 class LocalDateTime 序列化 public SpringBoot


    1. 使用@JsonSerialize和@JsonDeserialize注解

    2. 全局配置Jackson的ObjectMapper

    3. 使用@ControllerAdvice配合@InitBinder

    4.  自定义HttpMessageConverter

    5. 使用AOP进行切面编程

    结语

在Spring Boot中,对接口的请求入参和出参进行自定义的增强或者修改,通常有以下几种方法:

1. 使用@JsonSerialize和@JsonDeserialize注解

可以在实体类的字段上使用这两个注解来指定自定义的序列化器和反序列化器。

使用场景

当需要对某个特定字段进行自定义的序列化和反序列化时。
当实体类中的某些字段类型不是标准的JSON类型,需要转换成JSON能识别的格式时。
需要在序列化和反序列化过程中添加自定义逻辑,如加密、解密、格式转换等。

首先,定义自定义的序列化器和反序列化器:

public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }
}

public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}

然后,在实体类中使用这些注解:

public class MyEntity {
    @JsonSerialize(using = CustomLocalDateTimeSerializer.class)
    @JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
    private LocalDateTime dateTime;

    // getters and setters
}

2. 全局配置Jackson的ObjectMapper

通过配置ObjectMapper来全局地改变序列化和反序列化的行为,可以添加自定义的模块或配置属性。

使用场景

当项目中多个实体类需要应用相同的序列化和反序列化规则时。
需要在全局范围内统一处理日期、时间、枚举等类型的序列化和反序列化。
需要对ObjectMapper进行全局的配置,如设置默认的时区、日期格式等。

创建一个自定义模块,并注册序列化器和反序列化器:

public class CustomJacksonModule extends SimpleModule {
    public CustomJacksonModule() {
        addSerializer(LocalDateTime.class, new CustomLocalDateTimeSerializer());
        addDeserializer(LocalDateTime.class, new CustomLocalDateTimeDeserializer());
    }
}

然后,配置ObjectMapper:

@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    return builder -> {
        builder.modules(new CustomJacksonModule());
    };
}

3. 使用@ControllerAdvice配合@InitBinder

要对Spring MVC的控制器进行全局的配置,可以使用@ControllerAdvice注解。然后,在这个类中使用@InitBinder注解的方法来注册自定义的属性编辑器。
注意:@InitBinder主要用于处理表单数据的绑定,对于JSON数据的序列化和反序列化,它并不是最直接的方法。但如果是处理非JSON格式的请求体(如表单数据),则可以使用此方法。

使用场景(对于JSON数据,更偏向于使用其他方法;对于表单数据):

当需要对表单数据的绑定进行自定义处理时。
当需要在多个控制器中复用相同的表单数据绑定逻辑时。

创建一个自定义的属性编辑器:

public class CustomLocalDateTimeEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    }

    @Override
    public String getAsText() {
        LocalDateTime value = (LocalDateTime) getValue();
        return value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}

然后,在@ControllerAdvice类中注册这个属性编辑器:

@ControllerAdvice
public class CustomControllerAdvice {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(LocalDateTime.class, new CustomLocalDateTimeEditor());
    }
}

4. 自定义HttpMessageConverter

可以编写自定义的HttpMessageConverter来处理特定的媒体类型,并在其中实现自定义的序列化和反序列化逻辑。然后,将其注册到Spring MVC的配置中。

使用场景:

当Spring Boot默认的HttpMessageConverter无法满足自定义的序列化和反序列化需求时。
当需要处理非标准的媒体类型时,如自定义的二进制格式或文本格式。
当需要在序列化和反序列化过程中应用复杂的业务逻辑时。

创建一个自定义的HttpMessageConverter:


public class CustomLocalDateTimeConverter extends MappingJackson2HttpMessageConverter {
    public CustomLocalDateTimeConverter() {
        super();
        ObjectMapper customObjectMapper = new ObjectMapper();
        customObjectMapper.registerModule(new CustomJacksonModule());
        setObjectMapper(customObjectMapper);
    }
}

然后,在配置类中注册这个转换器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, new CustomLocalDateTimeConverter());
    }
}

5. 使用AOP进行切面编程

可以使用Spring AOP来对控制器的方法进行切面,从而在方法执行前后进行自定义的序列化和反序列化操作。

使用场景

当需要在不修改原有业务代码的情况下,对方法入参和出参进行额外的处理时。
当需要对多个控制器或方法中的入参和出参应用统一的处理逻辑时。
当处理逻辑与业务逻辑相对独立,且需要保持代码结构清晰时。

首先,定义一个切面:

@Aspect
@Component
public class CustomSerializationAspect {
    @Before("execution(* com.example.controller..*.*(..)) && args(..,@RequestParam(..),@RequestBody(..))")
    public void beforeControllerMethod(JoinPoint joinPoint) {
        // 在这里可以修改入参,但通常不建议这么做,因为这会改变方法的签名
        // 更常见的是在处理响应后进行修改
    }

    @AfterReturning(pointcut = "execution(* com.example.controller..*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)", returning = "result")
    public void afterControllerMethod(JoinPoint joinPoint, Object result) {
        // 在这里可以修改出参,例如将LocalDateTime转换为特定格式的字符串
        if (result instanceof MyEntity) {
            MyEntity entity = (MyEntity) result;
            // 假设你想在这里修改entity的dateTime字段
        }
    }
}

注意:AOP通常用于横切关注点的处理,如日志、事务管理等,而不是用于修改方法的入参和出参。如果你需要修改入参和出参,通常建议使用其他方法,如自定义的HttpMessageConverter或@ControllerAdvice。上面的AOP中捕获方法的执行,但实际上修改入参是不推荐的,而出参的修改也通常不是AOP的最佳用途。如确实要在AOP中修改出参,考虑使用@AfterReturning注解。更常见和推荐的做法使用Jackson的序列化特性或@ControllerAdvice来全局处理响应体的格式。

结语

选择哪种方法取决于具体需求。对于简单的自定义需求,使用@JsonSerialize和@JsonDeserialize注解是最直接和简单的方式。而对于更复杂的全局配置或跨多个控制器的需求,则可能需要使用ObjectMapper的配置或@ControllerAdvice。

原创 码到三十五

标签:springboot,自定义,使用,加解密,class,LocalDateTime,序列化,public,SpringBoot
From: https://www.cnblogs.com/o-O-oO/p/18555835

相关文章

  • HarmonyOS Next企业级数据安全防护实战:加解密技术综合应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在企业级数据安全防护中加解密技术的综合应用,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、......
  • HarmonyOS Next加解密算法开发实践与优化策略
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)中加解密算法开发的实践经验与优化策略,基于实际开发案例进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、加解密......
  • HarmonyOS Next加解密算法中的参数与模式详解
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)中加解密算法参数与模式的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、加解密参数......
  • HarmonyOS Next智能家居系统安全加固:加解密技术的深度应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在智能家居系统安全加固中加解密技术的应用,基于实际开发经验进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、智......
  • 基于Java+SpringBoot的影院订票系统
    关注底部领取源码源码编号:S346源码名称:基于SpringBoot的影院订票系统用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:11张表是否有毕业论文......
  • 基于Java+SpringBoot的影院订票系统
    关注底部领取源码源码编号:S346源码名称:基于SpringBoot的影院订票系统用户类型:双角色,用户、管理员主要技术:Java、Vue、ElementUl、SpringBoot运行环境:Windows/Mac、JDK1.8及以上运行工具:IDEA/Eclipse数 据 库:MySQL5.7及以上版本数据库表数量:11张表是否有毕业论文......
  • springboot服装生产管理的设计与实现(代码+数据库+LW)
    摘  要本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理,提高管理效率,使得协力服装厂服装生产管理作规范化、科学化、高效化。本文重点阐述了协力服装厂服装生产管理系统的开发过程,以实际运用为开发背景,基于Springboot框架,运用了Java编程语言和M......
  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现四
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • 基于Java+Springboot+Jpa+Mysql实现的在线网盘文件分享系统功能设计与实现三
    一、前言介绍:免费学习:猿来入此1.1项目摘要在线网盘文件分享系统的课题背景主要源于现代社会对数字化信息存储和共享需求的日益增长。随着互联网的普及和技术的快速发展,人们越来越依赖电子设备来存储和传输各种类型的数据文件。然而,传统的本地存储方式存在诸多不便,如空间有限、......
  • SpringBoot在线网盘管理系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​在......