当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot中接受阿拉伯语日期作为查询参数

白永昌
2023-03-14

我想在查询参数中接受阿拉伯日期

例如:٢٠٢١-٠٧-٢٠这个日期的英文版是2021-07-20我找到了这个解决方案。

DecimalStyle defaultDecimalStyle
        = DateTimeFormatter.ISO_LOCAL_DATE.getDecimalStyle();
DateTimeFormatter arabicDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE
        .withDecimalStyle(defaultDecimalStyle.withZeroDigit('\u0660'));

String encodedArabicDateStr = "%D9%A2%D9%A0%D9%A1%D9%A9-%D9%A0%D9%A4-%D9%A1%D9%A5";
String arabicDateStr
        = URLDecoder.decode(encodedArabicDateStr, StandardCharsets.UTF_8);
LocalDate date = LocalDate.parse(arabicDateStr, arabicDateFormatter);
System.out.println("Parsed date: " + date);

它如预期般工作

现在,在我的SpringBoot应用程序中,我使用模式处理@DateTimeFormat

@DateTimeFormat(pattern = "yyyy-MM-dd") val fromDate: LocalDate

我如何告诉Spring Boot使用自定义方法来解析日期?最初的问题是当有人发送阿拉伯日期时,应用程序会崩溃并出现以下错误:

org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'dateRange' on field 'fromDate': rejected value [٢٠٢١-٠٧-٢٠];
codes [typeMismatch.dateRange.fromDate,typeMismatch.fromDate,typeMismatch.java.time.LocalDate,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dateRange.fromDate,fromDate];
arguments [];
default message [fromDate]];
default message [Failed to convert value of type 'java.lang.String[]' to required type 'java.time.LocalDate';
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '٢٠٢١-٠٧-٢٠'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [٢٠٢١-٠٧-٢٠]]

我试过:

  • 通过筛选器更新请求值,但它不起作用。
  • 格式化转换服务,如此示例。

共有2个答案

白嘉石
2023-03-14

由于需要从查询参数解析日期,因此需要将逻辑实现为Converter。

@Component
public class ArabicDateConverter implements Converter<String, LocalDate> {

  private final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE
          .withDecimalStyle(DateTimeFormatter.ISO_LOCAL_DATE.getDecimalStyle().withZeroDigit('\u0660'));

  @Override
  public LocalDate convert(String source) {
    return LocalDate.parse(source, formatter);
  }
}

注意@Component,它用于注册转换器。

请记住,这只会转换阿拉伯日期,其他格式将失败。如果需要解析其他格式,则可能需要保留可能的格式列表以进行迭代,直到某些格式匹配为止。

柯锋
2023-03-14

您可以为LocalDate创建自己的自定义反序列化器,它将包含格式字段。

本地日期创建自定义反序列化程序

public class CustomDateDeserializer extends JsonDeserializer<LocalDate> {
    @Override
    public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        DecimalStyle defaultDecimalStyle = DateTimeFormatter.ISO_LOCAL_DATE.getDecimalStyle();
        DateTimeFormatter arabicDateFormatter = DateTimeFormatter.ISO_LOCAL_DATE.withDecimalStyle(defaultDecimalStyle.withZeroDigit('\u0660'));

        String arabicDateStr = URLDecoder.decode(jsonParser.getText(), StandardCharsets.UTF_8);
        return LocalDate.parse(arabicDateStr, arabicDateFormatter);
    }
}

使用LocalDate的自定义反序列化器

@JsonSerialize(using = CustomDateDeserializer.class)
private LocalDate fromDate;
 类似资料:
  • 问题内容: 我正在评估NLTK处理阿拉伯文本的能力,这项研究旨在分析和提取情感。 问题如下: NTLK是否可以处理并允许分析阿拉伯文本? python是否能够操纵\标记阿拉伯文本? 我可以使用Python解析和存储阿拉伯文本吗? 如果python和NTLK不是完成这项工作的工具,那么您会推荐哪些工具(如果存在)? 谢谢。 编辑 根据研究: NTLK仅能阻止阿拉伯文本:链接 Python支持UTF-

  • 问题内容: 我有来自服务器的日期,格式为“ 2013-01-20T16:48:43”,我的应用程序同时支持阿拉伯语和英语语言环境。但是,当我将语言环境更改为阿拉伯语时,日期无法解析,因此无法解析。到现在为止我写的是 问题答案: 不要将您的日期解析为阿拉伯语,除了按如下方式尝试通过仅设置“英语区域设置”之外,它还会给您带来错误提示。

  • 我有一门豆子课 这在rest控制器类中使用 现在,当我传递一个阿拉伯日期对象时,该对象编码如下 %D9%A2%D9%A0%D9%A1%D9%A9-%D9%A0%D9%A4-%D9%A1%D9%A5,转换失败,出现以下错误 org.springframework.validation.bindexception:org.springframework.validation.BeanPropertyB

  • 在 Dreamweaver 中将双向流量应用到阿拉伯语和希伯来语文本;使用标签编辑器、“表格”属性和 Div 属性。 在中东和北非版本的此软件中,可通过阿拉伯语和希伯来语使用新的功能和改进功能。 双向文字流 中东语言的文字大多从右向左 (RTL) 书写。但是,一般而言,最常用的形式为双向 (bidi) 文字 - 混用从左向右和从右向左书写的文字。bidi 文字的一个示例是含有阿拉伯语和英语文字的段

  • Adobe 亚洲语言书写器 借助 Adobe 亚洲语言书写器,您可以使用中东和南亚语言创建内容。您可以键入或混合键入阿拉伯语、希伯来语、英语和其他语言。 您可以在“段落”面板菜单(窗口 > 段落 > 面板菜单)中的可用书写器之间进行选择。例如,您可以使用中东和南亚语言单行书写器或中东和南亚语言逐行书写器。 有关 Illustrator 中支持的其他亚洲语言的更多信息,请参阅适用于亚洲语言文字的书写

  • 启用中东语言功能 若要在 Photoshop 界面中显示中东文字选项,请执行以下操作: 选取“编辑”>“首选项”>“文字”(Windows) 或“Photoshop”>“首选项”>“文字”(Mac OS)。 在“选取文本引擎选项”部分中,选取“中东”。 单击“确定”,并重新启动 Photoshop。 选取“文字”>“语言选项”>“中东语言功能”。 文本方向 要创建阿拉伯语和希伯来语内容,您可以将默