можно переопределить аннотацию проверки jsr-303 - PullRequest
9 голосов
/ 30 января 2012

У меня есть тест, как показано ниже:

public class TestSizeAnnotation
{
public static void main(String[] args)
{
    System.out.println(
            Validation.buildDefaultValidatorFactory().getValidator().validate(new C()));
}

public static class P 
{
    private List<String> lst = newArrayList("AA");
    @Size(max=0, message="P")
    public List<String> getLst()
    {
        return lst;
    }
    public void setLst(List<String> lst)
    {
        this.lst = lst;
    }
}
public static class C extends P 
{
    @Override
    @Size(max=5, message="C")
    public List<String> getLst()
    {
        return super.getLst();
    }

}
}

со следующим выводом:
[ConstraintViolationImpl{interpolatedMessage='P', propertyPath=lst, rootBeanClass=class com....validator.TestSizeAnnotation$C, messageTemplate='P'}]

Однако я ожидал, что аннотация @Size может быть переопределена, и предупреждение не появится.
Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: Я обнаружил ошибка , похоже, связано с этим, но я запускаю 4.2.0 final и все еще получаю вышеуказанное поведение.

Ответы [ 3 ]

15 голосов
/ 30 января 2012

Переопределение аннотаций проверки фактически не поддерживается для JSR-303. Вместо этого будут применяться аннотации к переопределенным методам в подклассе совокупно : из раздела 3.3 спецификации:

A constraint declaration can be placed on an interface. For a given class,
constraint declarations held on super- classes as well as interfaces are
evaluated by the Bean Validation provider. Rules are formally described in
Section 3.4.5.

The effect of constraint declarations is cumulative. <b>Constraints declared
on a superclass getter will be validated along with any constraints defined
on an overridden version of the getter according to the Java Language
Specification visibility rules.</b>
3 голосов
/ 30 января 2012

Вы можете переопределить проверку настроенной аннотации через конфигурацию xml:

http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html_single/#validator-xmlconfiguration

В вашем случае, если вы объявляете другую проверку (или отсутствие проверки) для getList () methidв файле validation.xml он переопределит аннотацию @Size.

1 голос
/ 30 января 2012

Только для записей я нашел обход своей проблемы:

public class TestSizeAnnotation
{
    public static void main(String[] args)
    {
        System.out.println("c " + 
                Validation.buildDefaultValidatorFactory().getValidator().validate(new C(), Default.class, SizeGroup2.class));
        System.out.println("p " + 
                Validation.buildDefaultValidatorFactory().getValidator().validate(new P(), Default.class, SizeGroup.class));
    }
    public static interface SizeGroup {}
    public static interface SizeGroup2 {}
    public static class P 
    {
        private List<String> lst = newArrayList("AA");
        @Size(max=0, message="P" , groups=SizeGroup.class)
        public List<String> getLst()
        {
            return lst;
        }
        public void setLst(List<String> lst)
        {
            this.lst = lst;
        }
    }
    public static class C extends P 
    {
        @Override
        @Size(max=5, message="C", groups=SizeGroup2.class)
        public List<String> getLst()
        {
            return super.getLst();
        }

    }
}
...