2012-12-20 35 views
0

我想在控制器中指定BindingResult的實現類型。有沒有辦法做到這一點?目前看來,Spring必須確定實現類型本身(這恰好是一個BeanPropertyBindingResult)。我懷疑有一個配置是我在某處丟失的,或者我只需要在Controller的方法簽名中指定實際的類型。在Spring中,如何指定BindingResult實現

例子:

/** 
* {@inheritDoc} 
*/ 
@Override 
public ModelAndView continue(@ModelAttribute("model") @Valid final T model, final BindingResult results) { ... } 
+0

爲什麼你需要一個BindingResult的具體實現? – hyness

+0

我試圖擴展Spring的ObjectError和FieldError對象,以包含驗證消息的錯誤級別(即:info,warn,error)。現在,Spring正在確定BindingResult(這是我在驗證過程中添加錯誤的地方)。我需要能夠保證實施類型,以便新的錯誤正常工作。 – Mostfoolish

回答

-1

您必須添加的ModelAndView在前面的@ModelAttribute像:

public ModelAndView continue(ModelAndView model, @ModelAttribute("model") ObjectType objectName){ 
} 
+0

這是如何影響BindingResult的? – Mostfoolish

1

你不需要自定義BindingResult你想要做什麼。您需要實現BindingErrorProcessor並在WebDataBinder中使用它。它負責將錯誤添加到BindingResult並允許您使用自定義錯誤實施。這裏是你將如何使用它在你的控制器......

@Controller 
public class MyFormController { 
    ... 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.setBindingErrorProcessor(new MyCustomBindingErrorProcessor()); 
    } 
} 

混合綁定和驗證是不好的做法,類應該有一個單一的責任。你不應該在BindingResult本身進行驗證。

+0

我的意圖不是混合綁定和錯誤。只有這些錯誤纔會添加到BindingResult。雖然我知道Spring會自動實例化BeanPropertyBindingResult,但它必須默認這樣做,因爲我沒有故意設置它。我以爲我想故意設置實現類,這樣如果Spring決定爲一些未知的(至少是我)理由實例化一個不同的類,我就不會遇到問題。 – Mostfoolish

+0

據我可以告訴代碼,設置一個BindingResult實現是不可插入的。在DataBinder中,它與其他配置一起在initBeanPropertyAccess方法中實例化。此外,國際海事組織你仍然沒有給出你需要使用自定義實施的充分理由。 BindingErrorProcessor是否足以滿足你需要做的事情? – hyness

+0

老實說,我不確定我想要一個自定義的。我只是想能夠指定哪個實現 - 實現仍然可以是原始的BeanPropertyBindingResult。我只是擔心Spring可能會選擇在另一個控制器上實例化不同的實現,原因是我不知道。 – Mostfoolish