gpt4 book ai didi

Spring 中的 Java 8 Optional 验证解包器

转载 作者:IT老高 更新时间:2023-10-28 13:47:28 28 4
gpt4 key购买 nike

在我的 DTO 中使用以下验证规则时,在我的 Spring Boot 项目中

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

我收到以下异常

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

我无法在任何地方找到如何在 Spring 中注册自定义验证值解包器

最佳答案

您应该向 validator 注册一个 ValidatedValueUnwrapper

validator 可以通过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>

或者在java中:

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

您可以找到 proper ValidatedValueUnwrapper implementation在 dropwizard 框架中(基于 Optional from guava)。

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();
}
}

关于Spring 中的 Java 8 Optional<?> 验证解包器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29943944/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com