当前位置: 首页 > news >正文

茌平做网站推广动易与php环境架设网站

茌平做网站推广,动易与php环境架设网站,电影的网络营销方式,班级建设网站首页1. 场景 在WEB开发,客户端和服务端传输的数据中经常包含一些这样的字段:字段的值只包括几个固定的字符串。 这样的字段意味着我们需要在数据传输对象(Data Transfer Object, DTO)中对该字段进行校验以避免客户端传输的非法数据持…

1. 场景

在WEB开发,客户端和服务端传输的数据中经常包含一些这样的字段:字段的值只包括几个固定的字符串。 这样的字段意味着我们需要在数据传输对象(Data Transfer Object, DTO)中对该字段进行校验以避免客户端传输的非法数据持久化到我们的系统中。

public record UserCreateDto(String userName,// userType的值为NORMAL, SILVER_CARD, GOLD_CARD, String userType) {}

我们可以采用多种办法验证userType的正确性,如:

方法一:利用Validation和正则表达式进行验证

public record UserCreateDto(String userName,// userType的值为NORMAL, SILVER_CARD, GOLD_CARD@Pattern(regexp = "^NORMAL$|^SILVER_CARD$|^GOLD_CARD$")String userType) {
}

方法二:在代码中写validate方法,在使用到DTO代码中调用validate方法

public record UserCreateDto(String userName,// userType的值为NORMAL, SILVER_CARD, GOLD_CARDString userType) {public void validate() {if (List.of("NORMAL", "SILVER_CARD", "GOLD_CARD").contains(userType)) {return;}throw new IllegalArgumentException("userType must be NORMAL, SILVER_CARD, GOLD_CARD");}
}

比较这两种方法,两种方法各有优缺点:

优点缺点
方法一在DTO创建时(即参数的入口处)就可以验证数据的有效性在@Pattern中使用字符串常量不方便,意味着开发者很难在整个代码中使用统一的自定义常量,为后期的修改带来不便
方法二开发者可以在整个代码中使用统一的自定义常量,方便后续的修改需要开发者主动调用validate方法,容易遗漏调用

2. 面向对象的解决办法

可能你早已想到用枚举来解决上述场景中的问题,没错,在面向对象编程中,枚举是解决这种问题的最好的解决办法。

public enum UserType {NORMAL, SILVER_CARD, GOLD_CARD
}public record UserCreateDto(String userName,// userType的值为NORMAL, SILVER_CARD, GOLD_CARD@NotNullUserType userType) {
}

枚举让我们的参数具有类型约束,并且具有可复用性易修改等特性。

但是在SpringBoot中默认是不支持String到Enum的转换(读者可以尝试一下,不管客户端传入的userType正确与否,在DTO中userType值均为null )。

为了解决这个问题很多开发者都是通过自定义Conveter来进行String到Enum的转换的。如此常见的场景,作为开发者的我们都能想到使用统一的Converter,难到作为框架的开发者想不到?

3. 一行代码解决String到Enum的转换问题

先上解决方案。

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {@Overridepublic void addFormatters(FormatterRegistry registry) {// 通过ApplicationConversionService向应用中注入ConverterApplicationConversionService.configure(registry);}

就是这么简单,在应用中自定义WebMvcConfigurer,覆写addFormatters方法,并通过ApplicationConversionService向应用中注入String到Enum的Converter。

4. 原理分析

通过分析ApplicationConversionService的时序图,我们可以看到ApplicationConversionService最终通过DefaultConversonService调用ConverterRegister向应用注册了StringToEnumConverterFactory,从名字可以看出来StringToEnumConverterFactory就是负责String向Enum转换的。
在这里插入图片描述
StringToEnumConverterFactory的代码如下:

final class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {@Overridepublic <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {return new StringToEnum(ConversionUtils.getEnumType(targetType));}private static class StringToEnum<T extends Enum> implements Converter<String, T> {private final Class<T> enumType;StringToEnum(Class<T> enumType) {this.enumType = enumType;}@Override@Nullablepublic T convert(String source) {if (source.isEmpty()) {// It's an empty enum identifier: reset the enum value to null.return null;}return (T) Enum.valueOf(this.enumType, source.trim());}}
}

可以看出,StringToEnumConverterFactory中也是通过Enum的valueOf方法完成String到Enum的转换的。

5. 方案的不足

采用Spring框架提供的StringToEnum Converter带给我们便利性的同时,也存在一些约束,如:

  • Enum中实例的大小写必须和字符串的大小写一致,如字符串是小写的normal、silver_card、gold_card,Enum定义的实例也必须是normal、silver_card、gold_card,这个可能并不符合代码规范(通常Enum的实例都要球全大写);
  • 字符串中包含一些特殊字符是Java命名规范不允许的,如中划线。

因此,选用哪种方法完成字符串到Enum的转换还要根据实际的应用场景出发。

http://www.yayakq.cn/news/644391/

相关文章:

  • 教育类手机网站模板下载嘉兴网站建设方案策划
  • 视频网站直播怎么做网络营销专业
  • 做一个网站大概需要多少钱网易企业邮箱怎么样
  • 专业网站建设最便宜免费推广平台有哪些软件
  • 电子商务网站规划与管理wordpress企业免费模板下载
  • 虹口网站开发培训课程wordpress与微信连接
  • 郑州免费网站建设哪家好wordpress 用户管理
  • 佛山模板建站哪家好类似 wordpress的软件
  • 通州网站开发公司在什么网站可以接设计做
  • 网站建设结课论文做跨境电商网站
  • 企业官网网站建设报价针式个人知识库管理系统
  • 织梦系统如何做网站地图店铺装修公司
  • 乐清网络网站建设保山哪里有网站建设
  • 建设网站的意义 作用是什么怎么注册域名邮箱
  • 厦门网盛网站开发北京注册公司需要什么手续和证件
  • 网易那个网站可以做字幕做网站被骗去哪投诉
  • 怎样开发手机网站vi企业整套设计公司
  • 网站空间服务器费用枣庄网站建设哪家好
  • 辽河油田建设有限公司网站个人怎么建立公众号
  • 沐众科技网站建设企业网站模板php
  • 网站编辑楼盘详情页怎么做广东seo推广软件
  • 开网店需要什么条件优化网站找哪家
  • 网站建设自己怎么做京东网站建设的意义
  • 知名大型网站搭建公司长链接转化成短链接工具
  • 能力天空的网站建设优劣势网站建设模板下载免费
  • 阿里巴巴1688网站做店铺商城平台开发公司
  • 做一元购网站 要多少钱ru后缀的网站
  • 鞍山晟宇网站建设wordpress 重置密码链接
  • 中文网站的seo怎么做做网站 中企动力
  • 买网站注册人数php网站模板制作软件