gpt4 book ai didi

java - 自定义 AnnotationFormatterFactory 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:43:55 24 4
gpt4 key购买 nike

我正在尝试为我的模型运行格式化程序。该模型包含类似于以下代码的注释。我有多个 Formatter 我还没有开始运行,但无法找出问题所在。

public class Customer {
@Trim
private String firstName;
//some other properties, getter and setter
}

据我所知,注释设置正确:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface Trim {
boolean squashMultipleSpaces() default true;
}

还有 AnnotationFormatterFactory

public class TrimAnnotationFormatterFactory implements AnnotationFormatterFactory<Trim> {
public TrimAnnotationFormatterFactory() {
}

public Set<Class<?>> getFieldTypes() {
return Collections.singleton(String.class);
}

public Printer<String> getPrinter(Trim annotation, Class<?> fieldType) {
return new TrimAnnotationFormatterFactory.TrimFormatter(annotation.squashMultipleSpaces());
}

public Parser<String> getParser(Trim annotation, Class<?> fieldType) {
return new TrimAnnotationFormatterFactory.TrimFormatter(annotation.squashMultipleSpaces());
}

private static class TrimFormatter implements Formatter<String> {
private final boolean squashMultipleSpaces;

TrimFormatter(boolean squashMultipleSpaces) {
this.squashMultipleSpaces = squashMultipleSpaces;
}

public String parse(String text, Locale locale) {
return this.process(text);
}

public String print(String object, Locale locale) {
return this.process(object);
}

private String process(String text) {
if (text == null) {
return null;
} else {
return this.squashMultipleSpaces ? text.trim().replaceAll("\\s+", " ") : text.trim();
}
}
}
}

我将我的自定义 AnnotationFormatterFactory 添加到 FormatterRegistry。当我调试它时,我可以看到它已成功添加到 FormatterRegistry。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldAnnotation(new TrimAnnotationFormatterFactory());
}
}

Controller 看起来像:

@Controller
public class CustomerController {

@PostMapping(value = "/customer")
@ResponseBody
public Customer saveCustomer(@RequestBody Customer customer) {
return customer;
}
}

如果我的输入是这样的

"       Christian     Walter"

在 Controller 中,模型仍然相同。我期待着

"Christian Walter"

在我的模型中。

为什么我的格式化程序不起作用?或者我是否必须使用 PropertyEditor,如果是这样,我如何将它与注释一起使用?

更新:格式化程序已成功注册,但未被调用。并添加了 Controller 。

感谢您的帮助。

最佳答案

根据您上次的更新,我了解到您正在使用 json 反序列化您的对象。在这种情况下,您必须(在我看来)编写自己的反序列化器,如:

public class WhiteSpaceTrimmerDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
JsonNode node = jp.getCodec().readTree(jp);
return node.asText().replaceAll("\\s+", " ").trim();
}
}

像这样使用它:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class Customer {

private String firstName;


public String getFirstName() {
return firstName;
}

@JsonDeserialize(using = WhiteSpaceTrimmerDeserializer.class)
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}

因此 "Christian Walter" 将生成 "Christian Walter"

这个解串器还有另一种配置方式,你可以看看:Can Jackson be configured to trim leading/trailing whitespace from all string properties?

但为什么 Formatter 不工作?我唯一的解释是 @RequestBody/@ResponseBody 没有被 WebMvcConfigurer 处理。

关于java - 自定义 AnnotationFormatterFactory 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56867210/

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