Spring MVC Custom Formatter不是Firing

时间:2015-12-22 15:00:04

标签: java spring spring-mvc annotations custom-formatting

我正在尝试在Spring MVC中使用自定义格式化程序。我已经查看过几篇有关此事的帖子,包括:Custom Annotation-driven Formatting Spring MVC。我已经浏览了我的应用程序,我知道格式化程序正在注册。由于我确信格式化程序已注册,我认为它的注释被忽略了,但我不知道为什么。

这里是参考格式化工厂的注册方法:

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

注释:

@Target(value = { ElementType.FIELD })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface PhoneNumber
{

}

Formatter Factory:

public class PhoneNumberFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<PhoneNumber>
{

    @Override
    public Set<Class<?>> getFieldTypes()
    {
        Set<Class<?>> setTypes = new HashSet<Class<?>>();
        // setTypes.add(String.class);
        setTypes.add(PhoneNumber.class);
        return setTypes;
    }

    @Override
    public Printer<?> getPrinter(PhoneNumber annotation, Class<?> fieldType)
    {
        return new PhoneNumberFormatter();
    }

    @Override
    public Parser<?> getParser(PhoneNumber annotation, Class<?> fieldType)
    {
        return new PhoneNumberFormatter();
    }

}

格式化:

public class PhoneNumberFormatter implements Formatter<String>
{
    private static final Logger logger  = Logger.getLogger(PhoneNumberFormatter.class);
    @Override
    public String print(String subject, Locale locale)
    {
        logger.debug("formatting phone number");
        return subject + "BOO";
    }

    @Override
    public String parse(String text, Locale locale) throws ParseException
    {
        return text;
    }

}

视图中的用法: <tr> <td>Phone:</td> <td>${workOrderDetailBean.subscriberPhone}</td> </tr>

调试器的图片: Image of the debugger showing the formatter as added

2 个答案:

答案 0 :(得分:3)

你需要做的两件事:

  1. 确保您的工厂正在注册正确的类型。使用String.class代替PhoneNumber.class(假设您的bean将电话号码存储为String
  2. 请务必使用<spring:eval expression="workOrderDetailBean.subscriberPhone" htmlEscape="false"/>

答案 1 :(得分:0)

来自AnnotationFormatterFactory.getFieldTypes()的描述:

  

可以使用&lt; A&gt;注释的字段类型。注释

现在看一下这个例子:

@Override
public Set<Class<?>> getFieldTypes()
{
    Set<Class<?>> setTypes = new HashSet<Class<?>>();
    // setTypes.add(String.class);
    setTypes.add(PhoneNumber.class);
    return setTypes;
}

您应该取消注释String.class行,并删除PhoneNumber.class行。

P.S。您还可以将方法的主体简化为单行:

return Collections.<Class<?>>singleton(String.class);