2015-12-22 55 views
0

我想要在Spring MVC中使用自定義格式化程序。我已看過幾篇關於此的帖子,包括:Custom Annotation-driven Formatting Spring MVC。我瀏覽了我的應用程序,我知道格式化程序正在註冊。由於我確信格式化程序已註冊,我認爲它的註釋被忽略,但我不知道爲什麼。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; 
    } 

} 

用法在視圖中: Image of the debugger showing the formatter as added

回答

2

兩件事:

  1. 確保您的工廠登記正確的類型。使用String.class代替PhoneNumber.class(假設你的bean是存儲電話號碼作爲String
  2. 一定要使用<spring:eval expression="workOrderDetailBean.subscriberPhone" htmlEscape="false"/>
+0

使用''標籤是解決方案。感謝Adam。 – RhythmicDevil

+0

@ adam-erstelle你確定它是安全的嗎? 'spring:eval'評估Spring表達式(SpEL),這裏我們使用用戶的值。對我來說,看起來我們允許用戶執行任何SpEL表達式,這是安全漏洞。此外,禁用'htmlEscaping'看起來很奇怪,因爲可能會導致XSS。 –

+0

P.S.如果這個值是表單中的輸入,那麼你可以使用'',它應該可以工作。 –

0

AnnotationFormatterFactory.getFieldTypes()的描述:

類型可以與<阿來註釋>字段的調試器的 <tr> <td>Phone:</td> <td>${workOrderDetailBean.subscriberPhone}</td> </tr>

圖片註解。

現在看一下例子:

@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

相關問題