2015-04-29 11 views
11

Trong dự án Spring Boot của tôi khi sử dụng quy tắc xác nhận sau trong DTO của tôiJava 8 Tùy chọn <?> xác nhận unwrapper trong mùa xuân

@Length(max = 70) 
@UnwrapValidatedValue 
private Optional<String> vendorName; 

Tôi nhận được ngoại lệ sau

javax.validation.ValidationException: HV000182: No validation value unwrapper is registered for type java.util.Optional<java.lang.String> 

tôi không thể chỉ tìm bất kỳ nơi nào để đăng ký giá trị xác thực tùy chỉnh unwrapper trong Spring

Trả lời

3

Bạn nên đăng ký ValidatedValueUnwrapper cho trình xác thực.

Các validator có thể được cấu hình thông qua các LocalValidatorFactoryBean:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> 

    <bean name="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationPropertyMap"> 
     <util:map> 
     <entry key="hibernate.validator.validated_value_handlers" 
       value="com.mycompany.validator.OptionalValidatedValueUnwrapper"/> 
     </util:map> 
    </property> 
    </bean> 
</beans> 

hoặc trong java:

@Bean 
public LocalValidatorFactoryBean validator() { 
    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); 
    validator.getValidationPropertyMap().put("hibernate.validator.validated_value_handlers", 
      "com.mycompany.validator.OptionalValidatedValueUnwrapper"); 
    return validator; 
} 

Bạn có thể tìm thấy một proper ValidatedValueUnwrapper implementation trong khuôn khổ dropwizard (dựa trên Optional từ ổi).

public class OptionalValidatedValueUnwrapper extends ValidatedValueUnwrapper<Optional<?>> { 

    private final TypeResolver resolver = new TypeResolver(); 

    @Override 
    public Object handleValidatedValue(final Optional<?> optional) { 
     return optional.orNull(); 
    } 

    @Override 
    public Type getValidatedValueType(final Type type) { 
     ResolvedType resolvedType = resolver.resolve(type); 
     return resolvedType.typeParametersFor(Optional.class).get(0).getErasedType(); 
    } 
} 
+0

tôi nhanh chóng cố gắng như thế này và nó không hoạt động @Bean validator LocalValidatorFactoryBean công cộng() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.getValidationPropertyMap(). Put ("hibernate.validator.validated_value_handlers", "com ..... OptionalValidatedValueUnwrapper"); trình xác thực trả lại; } – Segabond

+0

Lạ, tôi đã thử nghiệm nó và nó hoạt động. Tôi chỉ cần thêm vào câu trả lời cấu hình dựa trên java tôi đã sử dụng. – gontard

+0

Có thể bạn có thể thêm điểm ngắt tại đây https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorFactoryImpl.java#L412 và gỡ lỗi cấu hình trình xác thực. – gontard

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