Есть ли какая-либо конфигурация, необходимая для использования пользовательских сообщений проверки гибернации - PullRequest
1 голос
/ 06 января 2011

Я использую следующий класс для проверки своих bean-компонентов с помощью Hibernate Validation.Работает отлично.По сути, слушатель обнаружил здесь для JPA 1, преобразованный для использования для проверки bean-компонентов в моих контроллерах Spring.Я пытаюсь настроить возвращаемые сообщения. Этот и любой другой ресурс, который я могу найти, скажем, просто поместил файл 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

1 Ответ

1 голос
/ 07 января 2011

Вы должны определить messageSource в контексте вашего приложения:

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

Чем вы просто используете бин для получения сообщений:

@Autowired
private MessageSource messageSource;

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

Для того, чтобы получить доступ к bean-компонентам в контексте, вам также необходимо сделать следующее:

@Component
public class BeanValidationTool{...
...