【问题标题】:Is there a Java formatting library for user input?是否有用于用户输入的 Java 格式化库?
【发布时间】:2020-05-13 02:14:06
【问题描述】:

这似乎是几乎任何 Java 项目都需要的一个非常普遍的东西。然而我找不到任何可以达到这个目的的东西。

我曾经使用一个名为 Stripes Framework 的网络框架,它具有注释驱动的验证器,并通过其验证器 API 自动格式化。

示例:

@Validate(maxlength = ModelConstants.NAME_MAX_LENGTH, converter = CapitializeFullyTypeConverter.class)
private String name;

@Validate(maxlength = ModelConstants.NAME_MAX_LENGTH, converter = EmailTypeConverter.class)
private String email;

这些字段将在您的控制器操作 bean 上定义,所有用户输入都将根据指定的规则自动进行验证和格式化。

如果有人将他们的电子邮件地址输入为:“TEST@TEST.COM” 然后它会自动格式化为:“test@test.com”

我想找到类似的东西来自动格式化 DTO 中的数据。

如果没有这样的东西可用,通常的处理方法是什么?肯定不是每个人都在为 DTO 中的每个 getter 编写自定义格式化函数吗?

【问题讨论】:

  • 您使用的是 Spring Boot 还是 Spring MVC?您的 conversions 是否应该仅适用于从请求字符串到 DTO 字符串,即在请求反序列化期间进行清理?什么是用户输入:HTTP request-parameters 还是 request-body(例如 JSON/XML)?

标签: java spring spring-mvc dto


【解决方案1】:

假设:“格式化程序”的含义为type-converter

当您要求基于注释的“格式化程序”时,您的意思是 Stripe Framework's @Validate 注释及其参数 converter转换器可以参数化为:

(class) 将用于将此参数转换为其对象表示的转换器类

在 Web-MVC 上下文中,这意味着 converter 用于转换请求参数,确切地说是它的 源值,由传入的 web 请求提供。 转换后的值然后作为目标值存储到(DTO)对象的属性中。

示例:(DTO) 字符串的转换

Web 请求以参数名称 email 和值字符串 TEST@EXAMPLE.COM 的形式给出。这应该转换为小写并存储在 DTO 的属性(也称为属性或字段)email 中作为值 test@example.com

DTO 的 Spring 注释

Spring Framework 还使用了 request validationrequest conversion 的概念。它还允许在 DTO 或类及其属性上配置这些注释驱动。

验证利用 Java Bean 验证标准 (JSR-303) javax.validation 注释,例如 @Valid@Length

conversionHttpConverters 的一部分,用于对对象 (DTO) 的响应/请求进行序列化/反序列化。因此 Spring 允许将 object-relational mapper (ORM) 框架或库包含为(例如 Maven)依赖项。这些带有自己的关于与他们对话的注释。

Fasterxml 的杰克逊

例如,Jackson (ORM) 使用注释 @JsonFormat 来实现简单的字符串转换 - 但仅适用于 DateNumber 等非字符串字段(只要我知道)。 它还允许通过注释@JsonSerialize@JsonDeserialize 完全自定义序列化器和反序列化器。 请注意,尽管 Jackson 中的许多注释都以“Json”命名,但它们大多也适用于 XML 甚至其他数据格式(表示),如 CSV 等。

Jackson 字符串转小写

您的问题是针对 Jackson 提出的:How to force Jackson deserialize field values to lower case 并已回答。

另见

【讨论】:

  • 你是对的,我最终指的是“类型转换”。猜猜我使用了错误的术语。谢谢您的回答。似乎创建自定义杰克逊反序列化器可能是要走的路,尽管我已经超越了这一点,最终只是通过设置器格式化输入。
【解决方案2】:

如果您使用的是 Spring Mvc,则可以访问格式化 API。 org.springframework.format.annotation 包中有用于日期和数字格式的预先存在的注释。

如果您需要自定义格式规则,您可以自己编写并通过FormattingConversionServiceFactoryBean 注册。

在此处查看一些示例:https://docs.spring.io/spring-framework/docs/3.2.0.RC1/reference/html/validation.html

【讨论】:

  • 谢谢。这不完全是我所追求的,但它看起来不像我正在寻找的存在。 Spring 解决方案的重量很重,不像在字段级别定义基于注释的类型转换器那么容易,这正是我所寻找的。​​span>
猜你喜欢
  • 2011-11-16
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多