2013-01-04 61 views
0

環境類型轉換:訪問Spring WebFlow和日期格式

春3.1.3.RELEASE

春Webflow的2.3.0.RELEASE

我最近發佈了此問題的泉源論壇。請參閱: Spring webflow formatting issue

我跟着和參考文檔中介紹的步驟在計算器上回答過:

Answer

我希望當我的表單提交,並結合發生時,解析拋出異常輸入無效的日期值時。但我不認爲這發生。

此外,如果和當拋出異常時,我如何處理它在前端顯示錯誤消息?

我想在我的應用程序中開始使用類型轉換。我按照下面的步驟爲Spring MVC和SWF配置了類型轉換格式。

我遵循的步驟,並加入到servlet上下文

<!-- Enables controllers mapped with @RequestMapping annotations, formatting annotations @NumberFormat 
    @DateTimeFormat, and JSR 303 style validation --> 
    <mvc:annotation-driven conversion-service="applicationConversionService1" /> 

<webflow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" view-factory-creator="mvcViewFactoryCreator" development="true"/> 

<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService"> 
     <constructor-arg ref="applicationConversionService1"/> 
    </bean> 

我創建了一個新的類來註冊自己在雙方的Spring MVC和Spring Web Flow的使用格式。

@Component(value = "applicationConversionService1") 
public class ApplicationConversionServiceFactoryBean extends 
     FormattingConversionServiceFactoryBean { 

    @Override 
    protected void installFormatters(FormatterRegistry registry) { 
     // Register the default date formatter provided by Spring 
     registry.addFormatter(new DateFormatter("dd/MM/yyyy")); 
    } 

} 

現在,當我部署到服務器,上下文被正確初始化並且類路徑掃描註冊該bean。

在我的表單模型綁定,我用新的dateformat註釋註釋日期字段。

@DateTimeFormat(pattern="dd/MM/yyyy") 
    private Date revisedTermExpiryDate = new Date(); 

更新: 我調試,正如我在我的類路徑中有喬達時間,我相信春天註冊喬達DateTimeFormatter而不是和解析沒有失敗。

如果我實際上刪除了註釋,它會調用DateFormatter,它會像預期的那樣引發解析異常,但在框架中會吞噬異常。

我的目標是註冊普通的DateFormatter與全局默認日期,嚴格解析(lenient = false)和正常處理任何解析異常。這對我來說是一個很棒的功能,而不是處理每個Web流的驗證器中的日期分析。

謝謝, 謝恩。

+0

你寫道:「我已經使用新的dateformat註解了一個日期字段 @DateTimeFormat(pattern =」dd/MM/yyyy「) - 所以DateFormatter類有寬容爲false,所以我期望提交表單輸入字段,如果O例如輸入值'24/15/2012',但是沒有輸入,則會發生解析異常。「 - 但你爲什麼期望這個,格式是正確的! – Ralph

+0

請在這裏發佈問題,而不是隻發佈到其他論壇的鏈接。 – Ralph

+0

ralph歡呼的回覆。這不是我的問題。它不是問題的格式。格式化程序應嚴格解析,因爲寬鬆是錯誤的。即月份值不正確。我已經做了一些挖掘,並相信我的格式化程序沒有註冊,因爲我在我的classpath中調用了joda DateTimeFormatter。我的目標是嚴格解析前端輸入日期,並在我的應用程序中優雅地處理異常。 –

回答

0

更新2:

我發現爲什麼例外是在我們的應用程序吞噬,我們從消息中驗證時清除的消息。

因此,如果日期格式化程序由於用戶輸入的值無效而引發異常,spring會優雅地處理這個異常,並在與該字段相關的消息上下文中創建四個錯誤消息鍵。例如,如果場revisedTermExpiryDate失敗,四個新的密鑰將被創建:

  1. recordDecisionFormModel.revisedTermExpiryDate.type不匹配
  2. revisedTermExpiryDate.typeMismatch
  3. java.util.Date.typeMismatch
  4. typeMismatch

您需要做的就是在您的messages.properties中指定其中一個密鑰與您的驗證消息。

實施例:

revisedTermExpiryDate.typeMismatch=Revised Term Expiry Date: DATE IS INVALID 

解決!!