Проверка компонентов JSR-303 изменяет значение во время проверки - PullRequest
1 голос
/ 14 марта 2012

В JSR-303 есть ли способ изменить значение при проверке?

public class MyEntity {

    public String getName() {
        return name;
    }

    // is it true that JSF/JAXB/JPA will always use this setter method?
    public void setName(final String name) {
        if (name == null) {
            throw new NullPointerException("null name");
        }
        final String collapsed = new CollapsedStringAdapter().unmarshal(name);
        if (collapsed.length() < NAME_SIZE_MIN) {
            throw new IllegalArgumentException("too short");
        }
        if (collapsed.length() > NAME_SIZE_MAX) {
            throw new IllegalArgumentException("too long");
        }
        this.name = collapsed;
    }

    @NotNull
    @Size(min = 1, max = 40)
    @CollapsedStringSize(min = 1, max = 40) // xs:token
    private String name;

    @NotNull
    @Size(min = 0, max = 255)
    @NormalizedStringSize(min = 0, max = 255) // xs:normalizedString
    private String description;
}

Скажем, я собираюсь сделать собственный валидатор, похожий на

@Constraint(validatedBy = CollapsedStringSizeValidator.class)
public @interface CollapsedStringSize {
    int min() default 0;
    int max() default Integer.MAX_VALUE;
}

public class CollapsedStringSizeValidator
    implements ConstraintValidator<CollapsedStringSize, String> {

    @Override
    public boolean isValid(String object,
                           ConstraintValidatorContext constraintContext) {

        if (object == null) {
            return true;
        }

        final String collapsed = new CollapsedStringAdapter().unmarshal(object);

        // how can I get the min/mix anyway?

        return collapsed.length() >= min && collapsed.length() <= max;
    }
}

Есть ли способ изменить значение до или во время валидации / валидации валидатора?
Должен ли я застрять с сеттером?

1 Ответ

1 голос
/ 15 марта 2012

В вашем примере setName() должно быть:

public void setName(final String name) {
    if (name == null) {
        this.name = null;
        return;
    }
    this.name = new CollapsedStringAdapter().unmarshal(name);
}

Как и в приведенной выше модификации, вам не нужно больше использовать @CollapsedStringSize.@Size достаточно для вашей проверки.

В JPA, если вы хотите обрабатывать данные после того, как механизм JPA загрузил данные в ваш объект-сущность, вы можете попробовать @PostLoad.

...