Java 自定义注释FormatterFactory不';行不通

Java 自定义注释FormatterFactory不';行不通,java,spring,spring-mvc,formatting,Java,Spring,Spring Mvc,Formatting,我正在尝试让我的格式化程序运行我的模型。该模型包含如下代码所示的注释。我有多个格式化程序,我还没有运行,但无法找出问题所在 public class Customer { @Trim private String firstName; //some other properties, getter and setter } 据我所知,注释设置正确: @Documented @Retention(RetentionPolicy.RUNTIME) @Target({Elem

我正在尝试让我的格式化程序运行我的模型。该模型包含如下代码所示的注释。我有多个格式化程序,我还没有运行,但无法找出问题所在

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();
            }
        }
    }
}
控制器看起来像:

@Controller
public class CustomerController {

    @PostMapping(value = "/customer")
    @ResponseBody
    public Customer saveCustomer(@RequestBody Customer customer) {
        return customer;
    }
}
如果我的输入像这样

"       Christian     Walter"
在控制器中,模型仍然相同。我期待着

"Christian Walter"
在我的模型中

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

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


感谢您的帮助。

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

公共类WhiteSpaceTrimmerDeserializer扩展JsonDeserializer{
@凌驾
公共字符串反序列化(JsonParser jp,反序列化上下文ctxt)引发IOException{
JsonNode节点=jp.getCodec().readTree(jp);
return node.asText().replaceAll(“\\s+”,“”)。trim();
}
}
然后像这样使用它:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
公共类客户{
私有字符串名;
公共字符串getFirstName(){
返回名字;
}
@JsonDeserialize(使用=WhiteSpaceTrimmerDeserializer.class)
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
}
所以
“克里斯蒂安·沃尔特”
将产生
“克里斯蒂安·沃尔特”

还有其他配置此反序列化程序的方法,您可以查看:


但是为什么格式化程序不能工作呢?我唯一的解释是,
@RequestBody/@ResponseBody
不由
webmvcconfigure

处理。这不是问题所在。它应该将所有空间压缩为一个。问题是,格式化程序没有被调用。他们已成功注册,但未被调用。我将您的代码放在这里,它工作正常!我们有相同的配置吗?你能在github上分享你的代码吗?我看到你的控制器正在工作。那很有趣。当我根据自己的需要更新代码时,它就不再工作了。我认为如果我使用控制器,格式化程序也可以工作,就像我更新的问题一样。看看我的控制器。输出仍然未格式化。能否添加html模板?没有模板。这只是休息。使用和生成json
"Christian Walter"