1

我正在使用以下类通过 Hibernate Validation 来验证我的 bean。它工作得很好。它基本上是这里为 JPA 1找到的侦听器,已转换为用于验证我的 Spring 控制器中的 bean。我正在尝试自定义返回的消息。 这个和我能找到的所有其他资源都说只需将 ValidationMessages.properties 文件放在 Web-Inf 目录中。该文件也包含在下面。这是行不通的。有什么建议么?

public class BeanValidationTool {

    public void validate(Object entity) {
        TraversableResolver tr = new MyTraversableResolver();
        Validator validator = Validation.buildDefaultValidatorFactory().usingContext().traversableResolver(tr).getValidator();
        final Set<ConstraintViolation<Object>> constraintViolations = validator.validate(entity);
        if (constraintViolations.size() > 0) {
          Set<ConstraintViolation<?>> propagatedViolations = new HashSet<ConstraintViolation<?>>(constraintViolations.size());
          Set<String> classNames = new HashSet<String>();
            for (ConstraintViolation<?> violation : constraintViolations) {
              propagatedViolations.add(violation);
              classNames.add(violation.getLeafBean().getClass().getName());
            }
            StringBuilder builder = new StringBuilder();
            builder.append("validation failed for classes ");
            builder.append(classNames);
            throw new ConstraintViolationException(builder.toString(), propagatedViolations);
        }
    }

    public class MyTraversableResolver  implements TraversableResolver {

        public boolean isReachable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
            return traversableObject == null || Hibernate.isInitialized(traversableObject);
        }

        public boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class<?> rootBeanType, Path pathToTraversableObject, ElementType elementType) {
            return true;
        }
    }
  }`

ValidationMessages.properties 文件

validator.min = must be greater than or equal to {value}

validator.notEmpty = This field can't be empty
4

1 回答 1

1

您必须在应用程序上下文中定义 messageSource:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" abstract="false"
      scope="singleton" lazy-init="default">
    <property name="basename" value="ValidationMessages"/>
</bean>

比你只使用 bean 来检索消息:

@Autowired
private MessageSource messageSource;

public String getMessage(String messageName) {
    return messageSource.getMessage(messageName, null, null);
}

为了在上下文中访问 bean,您还必须这样做:

@Component
public class BeanValidationTool{...
于 2011-01-07T19:47:00.097 回答