2013-03-27 136 views
0

我有一些形式爲「X是有效的IFF服務Y返回Z」的業務驗證邏輯,其中X和Z在編譯時已知,並且Y的位置是從Spring配置加載的文件。運行時配置Hibernate驗證註釋

我想使用JSR-303基於註解的驗證,與Spring配置在一起,所以我可以寫類似下面的代碼:

自定義類級別約束註釋:

@MyValidation 
public class X { .... } 

ConstraintValidator爲@MyValidation

public class MyValidationValidator implements ConstraintValidator<MyValidation, X> { 
    private MyService service; 
    public MyService getService() { return service; } 
    public void setService(MyService serv) { this.service = serv; } 
    //Validation Logic... 
} 

Spring配置:

<bean id="ServiceY" class="..."> 
    ... 
</bean> 
<bean id="mvv" class="MyValidationValidator"> 
    <property name="service" value="ServiceY" /> 
</bean> 

但我試圖以這種方式結合這些方式失敗了,因爲驗證器的屬性沒有設置。

現在,我使用Spring AOP攔截器作爲解決方法,但這在我看來並不理想。

這裏的其他問題之一,讓我想到使用屬性文件/屬性,但不會要求我重複服務的配置?

另一個提到以編程方式定義約束映射,但如果我這樣做,我可能會更好我的解決方法。

任何關於如何做動態配置的線索?

回答

0

您應該使用Spring的LocalValidatorFactoryBean建立一個Bean驗證驗證:

<bean id="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

一個驗證設置了這種方式將在內部使用ConstraintValidatorFactory實施,其對創建驗證實例依賴注入,只要勾選service請在驗證器中輸入@Inject@Autowired。請注意,不需要將約束驗證器本身設置爲Spring bean。

你可以在Spring reference guide找到更多的細節。