gpt4 book ai didi

spring-mvc - Spring MVC 和 JSR 303 自定义验证与自定义资源包

转载 作者:行者123 更新时间:2023-12-01 04:05:11 27 4
gpt4 key购买 nike

我知道这已被问过数千次,但这确实是一场噩梦。几天来我一直试图弄清楚如何配置 Hibernate Validator 以使用我的属性资源包,但我仍然无法获得令人满意的结果......

这是我的网络上下文的一部分:

    <!-- i18n handling -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n.eSporx" />
</bean>

这是我的应用程序上下文的一部分:
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>

最后,我的(类级跨字段)自定义约束及其验证器:
@Documented
@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = CrossDateConstraintsValidator.class)
public @interface CrossDateConstraints {

String message() default "crossdate.validation.error";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

String startDateFieldName() default "startDate";

String endDateFieldName() default "endDate";
}


@Component
@Scope(SCOPE_PROTOTYPE)
public class CrossDateConstraintsValidator implements ConstraintValidator<CrossDateConstraints, Object> {

private String startDateField;
private String endDateField;
private String message;

@Override
public void initialize(final CrossDateConstraints constraintAnnotation) {
startDateField = constraintAnnotation.startDateFieldName();
endDateField = constraintAnnotation.endDateFieldName();
message = constraintAnnotation.message();
}

@Override
public boolean isValid(final Object annotatedClassInstance, final ConstraintValidatorContext context) {
boolean isValid = false;
try {
Date startDate = getDateFieldValue(annotatedClassInstance, startDateField);
Date endDate = getDateFieldValue(annotatedClassInstance, endDateField);
isValid = endDate.after(startDate);

if (!isValid) {
forceErrorsOnBothFields(context);
}

return isValid;
}
catch (Exception e) {
return isValid;
}
}

private void forceErrorsOnBothFields(final ConstraintValidatorContext context) {
context.buildConstraintViolationWithTemplate(message).addNode(startDateField).addConstraintViolation();
context.buildConstraintViolationWithTemplate(message).addNode(endDateField).addConstraintViolation();
}

private Date getDateFieldValue(final Object annotatedClassInstance, final String fieldName) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
Method dateGetter = new PropertyDescriptor(fieldName, annotatedClassInstance.getClass()).getReadMethod();
Date date = (Date) dateGetter.invoke(annotatedClassInstance);
return date;
}
}

资源包位于 src/main/resources/i18n/eSporx.properties 下(及其语言环境变体)。诸如 <spring:message code="my.key" /> 之类的东西在我的 JSP 中工作正常。但是,每当出现 CrossDateConstraints 错误时,即使 key 存储在属性文件中,我也只能读取“crossdate.validation.error”!

如果您有任何想法,请告诉我 :)
这太令人沮丧了。

罗尔夫

最佳答案

旧版本 hibernate-validator不允许覆盖默认资源包。请确保您使用的是最新版本,例如 4.2.0.Final .

也就是说,即使您已经使用了最新版本,该版本也可以被嵌入在您的应用程序服务器中的版本覆盖。例如,Glassfish 3.0 嵌入了一个版本的 hibernate-validator不支持资源包覆盖。

关于spring-mvc - Spring MVC 和 JSR 303 自定义验证与自定义资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953184/

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