1

{this} のようなものを hibernate バリデータの検証メッセージのメッセージ値として入れたいと思っています。

だから私はプロパティファイルでこの特定のメッセージの値をエスケープしました:\ {this \}

ただし、Hibrnate Validator は、指定されたキーにメッセージがあるかどうかを確認しようとします。これはバグだと思いますが、何か間違っているのでしょうか?(hibernate-validator 4.3.1 および 5.0.1 でテスト済み - 同じ結果 - スタック オーバーフロー

テストケース:

(簡単にするために、プロパティ ファイルはありません。Java クラスから値を返すだけです。実際には、handleGetObject はカスタム提供のプロパティから値を読み取ります):

import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.HibernateValidatorConfiguration;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator;
import org.junit.Test;

import javax.validation.*;
import javax.validation.constraints.Max;
import java.util.Enumeration;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Set;


public class HibValTest {

@Test
public void shouldNotSubstituteEscaped() throws Exception {

    MessageInterpolator interpolator = new ResourceBundleMessageInterpolator( new ResourceBundleLocator() {

        @Override
        public ResourceBundle getResourceBundle(Locale locale) {
            return new ResourceBundle() {

                @Override
                protected Object handleGetObject(String key) {
                    return "\\{escapedKey\\}";
                }

                @Override
                public Enumeration<String> getKeys() {
                    throw new UnsupportedOperationException();
                }
            };
        }
    }, false);

    HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure();
    config = config.messageInterpolator(interpolator).constraintValidatorFactory(new ConstraintValidatorFactoryImpl());

    ValidatorFactory factory = config.buildValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<A>> validate = validator.validate(new A());
}

private class A {
    @Max(value=1, message = "{key}")
    private int a=2;
}
}

結果:

at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.resolveParameter(ResourceBundleMessageInterpolator.java:244)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateBundleMessage(ResourceBundleMessageInterpolator.java:211)
4

1 に答える 1

0

これは確かにバグのようです。イシュー トラッカーでチケットを作成していただけますか?

当面は、エスケープされたキーに値を指定しないことでこれを回避できます (あなたのケースで可能な場合)。たとえば、次のようにします。

protected Object handleGetObject(String key) {
    return key.equals("key") ? "\\{escapedKey\\}" : null;
}
于 2013-05-21T10:35:27.243 に答える