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 に答える