2009-10-02 30 views
6

Tôi đã cố gắng thực hiện xác nhận cho các ứng dụng web của tôi như được mô tả trong phần 5.7.4.3 của tài liệu Xuân 3.0:Xuân JSR303 validation không hoạt động như được mô tả trong tài liệu xuân

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="validator"> 
       <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> 
      </property> 
     </bean> 
    </property> 
</bean> 

Tôi đã thêm hibernate-validator như một sự phụ thuộc và mọi thứ có vẻ OK, nhưng bắt đầu kết quả ứng dụng web của tôi dẫn đến lỗi sau:

org.springframework.beans.NotWritablePropertyException: 
Invalid property 'validator' of bean class 
[org.springframework.web.bind.support.ConfigurableWebBindingInitializer]: 
Bean property 'validator' is not writable or has an invalid setter method. 
Does the parameter type of the setter match the return type of the getter? 

Khi nhìn vào API, điều này là khá rõ ràng. LocalValidatorFactoryBean triển khai javax.validation.Validator trong khi ConfigurableWebBindingInitializer.setValidator() mong đợi một org.springframework.validation.Validator.

Bất kỳ giải pháp nào cho điều này?

EDIT

Về LocalValidatorFactoryBean:

This is the central class for javax.validation (JSR-303) setup in a Spring application context: It bootstraps a javax.validation.ValidationFactory and exposes it through the Spring Validator interface as well as through the JSR-303 Validator interface and the ValidatorFactory interface itself.

Giống như Alex Marshall nêu dưới đây đây là không trường hợp. LocalValidatorFactoryBean chỉ thực hiện javax.validation.Validator.

LocalValidatorFactoryBean không mở rộng SpringValidatorAdapter mặc dù, triển khai org.springframework.validation.Validator.

+0

Tôi cũng đã thử cập nhật thành 'hibernate-core-3.5.0.Beta-1' nhưng mã Hibernate của Spring không tương thích với phiên bản này. – Koraktor

+1

Đã mở một vấn đề JIRA tại http://jira.springframework.org/browse/SPR-6189. – Koraktor

Trả lời

6

Dưới đây là một cách giải quyết cho vấn đề này:

Sử dụng cấu hình bean validator từ câu hỏi của tôi ở trên, bạn phải thêm mã sau vào mỗi bộ điều khiển bằng cách xác thực.

@Autowired 
private javax.validation.Validator validator; 

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.setValidator((org.springframework.validation.Validator) this.validator); 
} 

Đó là bẩn, nhưng nó hoạt động vì LocalValidatorFactoryBean kéo dài SpringValidatorAdapter và điều này thực hiện org.springframework.validation.Validator.

4

Nếu bạn nhìn vào số Javadocs for ConfigurableWebBindingInitializer, trình xác thực 'thuộc tính' thuộc loại 'org.springframework.validation.Validator'. Nếu sau đó bạn nhìn vào số Javadocs for LocalValidatorFactoryBean, bạn sẽ thấy rằng nó thực sự không triển khai FactoryBean (để tạo ra một org.springframework.validation.Validator) và cũng không thực hiện chính org.springframework.validation.Validator, vì vậy bạn cho thuộc tính 'validator' của ConfigurableWebBindingInitializer có kiểu sai, như được chỉ ra bởi lỗi. Tôi nghi ngờ đây là một (gross?) Giám sát trên một phần của các nhà phát triển Spring, và bạn nên tạo ra một vấn đề cho điều này trong theo dõi vấn đề JIRA của họ tại jira.springframework.org

+0

Vì vậy, nghi ngờ đầu tiên của tôi là chính xác. Cảm ơn bạn đã xác nhận điều đó. Tôi sẽ thử nộp một lỗi. – Koraktor

+1

Không phù hợp để gọi nó là giám sát tổng thể, cho rằng Spring 3 vẫn đang được thử nghiệm. – skaffman

Các vấn đề liên quan