gpt4 book ai didi

java - 如何强制 spring org.springframework.format.annotation.DateTimeFormat 为自定义 DateFormatter

转载 作者:行者123 更新时间:2023-12-02 10:10:31 25 4
gpt4 key购买 nike

我有一个场景,我有不同类型的日期即将到来,在这种情况下,现有的 spring 转换会失败,因为即将到来的日期格式不同。

有没有办法让 Spring 使用我的自定义 DateFormatter ?

最佳答案

Is there a way I can make Spring use my custom DateFormatter ?

是的,但由于您的用例是特定的,我认为最好使用自定义注释来使所有内容明确

这些interface s 可用于完成此任务:

这些类的源码可以作为引用:

你可以这样做:

UnstableDateFormats注释

@Retention(RUNTIME)
public @interface UnstableDateFormats {
String[] formatsToTry();
}

Formatter实现

public class UnstableDateFormatter implements Formatter<LocalDate> {
private final List<String> formatsToTry;

public UnstableDateFormatter(List<String> formatsToTry) {
this.formatsToTry = formatsToTry;
}

@Override
public LocalDate parse(String text, Locale locale) throws ParseException {
for (String format : formatsToTry) {
try {
return LocalDate.parse(text, DateTimeFormatter.ofPattern(format));
} catch (DateTimeParseException ignore) {
// or log the exception
}
}
throw new IllegalArgumentException("Unable to parse \"" + text
+ "\" as LocalDate using formats = " + String.join(", ", formatsToTry));
}

@Override
public String print(LocalDate object, Locale locale) {
// Implement this method thoroughly
// If you're accepting dates in different formats which one should be used to print the value?
return object.toString();
}
}

AnnotationFormatterFactory实现

public class UnstableDateFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<UnstableDateFormats> {
@Override
public Set<Class<?>> getFieldTypes() {
return Collections.singleton(LocalDate.class);
}

@Override
public Printer<?> getPrinter(UnstableDateFormats annotation, Class<?> fieldType) {
return new UnstableDateFormatter(Arrays.asList(annotation.formatsToTry()));
}

@Override
public Parser<?> getParser(UnstableDateFormats annotation, Class<?> fieldType) {
return new UnstableDateFormatter(Arrays.asList(annotation.formatsToTry()));
}
}

不要忘记注册 AnnotationFormatterFactory实现:

如果您使用 spring mvc,您可以在 Web 配置中执行此操作(请参阅 Type Conversion ):

public class MvcConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldAnnotation(new UnstableDateFormatAnnotationFormatterFactory());
}
}

另请参阅:

您可能还需要考虑:

关于java - 如何强制 spring org.springframework.format.annotation.DateTimeFormat 为自定义 DateFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55028978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com