2015-12-22 6 views
0

Я пытаюсь получить пользовательский форматтер, работающий в Spring MVC. Я рассмотрел несколько сообщений по этому вопросу, в том числе: Custom Annotation-driven Formatting Spring MVC. Я проследил свое приложение, и я знаю, что форматер регистрируется. Поскольку я уверен, что форматер зарегистрирован, я думаю, что его аннотация игнорируется, но я не знаю, почему.Spring MVC Custom Formatter не стреляет

Для справки здесь, как зарегистрировать форматтера завод:

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

Аннотация:

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

} 

Formatter Фабрика:

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(); 
    } 

} 

Formatter:

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

2 вещи, которые нужно сделать:

  1. Убедитесь, что ваш завод регистрации правильных типов. Используйте String.class вместо PhoneNumber.class (предполагается, что боб сохранение телефонного номера в качестве String)
  2. Обязательно используйте <spring:eval expression="workOrderDetailBean.subscriberPhone" htmlEscape="false"/>
+0

Использование тега '' было решением. Спасибо Адаму. – RhythmicDevil

+0

@ adam-erstelle Вы уверены, что это безопасно? 'spring: eval' оценивает выражение Spring (SpEL), и здесь мы используем значение от пользователя. Для меня это похоже на то, что мы разрешаем пользователю выполнять любое выражение SpEL, которое является нарушением безопасности. Также отключить 'htmlEscaping' выглядит странно, потому что это может привести к XSS. –

+0

P.S. Если это значение является входом в форму, вы можете просто использовать '', и он должен работать. –

0

Из описания AnnotationFormatterFactory.getFieldTypes():

типов полей, которые могут быть аннотированный с < A> аннотаций.

А теперь посмотрим на пример:

@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); 
+0

Привет Слава, у меня была линия с String.class раскомментируйте, это не имеет никакого значения. Я просто оставил его в коде для справки, пока я работал над проблемой. – RhythmicDevil