Spring MVC 自定义格式化程序未触发
Spring MVC Custom Formatter is not Firing
我正在尝试让自定义格式化程序在 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
{
}
格式化工厂:
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>
调试器图片:
根据AnnotationFormatterFactory.getFieldTypes()的描述:
The types of fields that may be annotated with the <A> annotation.
现在看例子:
@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);
您需要做的 2 件事:
- 确保您的工厂正在注册正确的类型。使用
String.class
而不是 PhoneNumber.class
(假设您的 bean 将 phone 数字存储为 String
)
- 一定要用
<spring:eval expression="workOrderDetailBean.subscriberPhone" htmlEscape="false"/>
我正在尝试让自定义格式化程序在 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
{
}
格式化工厂:
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>
调试器图片:
根据AnnotationFormatterFactory.getFieldTypes()的描述:
The types of fields that may be annotated with the <A> annotation.
现在看例子:
@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);
您需要做的 2 件事:
- 确保您的工厂正在注册正确的类型。使用
String.class
而不是PhoneNumber.class
(假设您的 bean 将 phone 数字存储为String
) - 一定要用
<spring:eval expression="workOrderDetailBean.subscriberPhone" htmlEscape="false"/>