Nano Hash - криптовалюты, майнинг, программирование

Интерполировать специфичные для проверки параметры в сообщении проверки bean-компонента

У меня есть собственный валидатор bean-компонентов, который проверяет, является ли данное поле объекта уникальным для некоторых условий. Если проверка не пройдена, сообщение должно включать поле (например, идентификатор) уже существующего объекта. Так, например, сообщение должно быть:

"Product 42 already has such a value defined, choose a unique value."

Возможно ли это с помощью проверки bean-компонентов?

AFAICS формат сообщения может включать такие параметры, как:

"Length must be between {min} and {max}."

Но это может ссылаться только на «статические» атрибуты аннотации проверки, в этом случае:

@Size(min=1, max=16)
private String name;

В моем случае значение известно только в пределах isValid моего пользовательского валидатора.


Ответы:


1

Вы правы! И для того, что вы хотите!, вы можете создать сообщение о нарушении ограничения внутри метода isValid(). Для этого аннотация ограничений должна быть специфичной для конкретного класса, к которому она была применена, и это должны быть ограничения проверки уровня класса. Внутри isValid перед возвратом false при неудачной проверке вы можете создать сообщение, состоящее из значения экземпляра класса. Например:

@check class Test{ int id; @validations...on fields}.

public boolean isValid(Test value, ConstraintValidatorContext context) 
{
// your check logic
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("It should be different for(custom message) .."+ value.id).addConstraintViolation();
return false; // based on constraint filure.

}

Но я думаю, вы хотите сделать это с аннотациями уровня поля! Я понятия не имею об этом, жду ваших результатов.

22.01.2011
  • Проблема в том, что я не хочу конструировать итоговое сообщение в валидаторе, только формат (для переводов) и параметры. Но я думаю, что я должен локализовать сообщение внутри валидатора. 25.01.2011
  • Я опубликовал решение, к которому мы пришли, как еще один ответ. Но я думаю, что ваш ответ допускает более конкретные сообщения об ошибках, даже если локализация должна быть выполнена внутри валидатора, я принял это. 09.09.2013

  • 2

    Это не самое лучшее решение, но в итоге мы добавили что-то вроде следующего в наш код обработки исключений верхнего уровня:

    String getConstraintViolationMessages(ConstraintViolationException e) {
        StringBuilder sb = new StringBuilder();
        for (ConstraintViolation<?> violation : e.getConstraintViolations()) {
            sb.append(getMessage(violation));
            sb.append("\n");
        }
        sb.setLength(sb.length() - 1);
        return sb.toString();
    }
    
    String getMessage(ConstraintViolation<?> violation) {
        String key = violation.getMessageTemplate();
        String messageFormat = localize(key);
    
        Object entity = violation.getRootBean();
        String identifier;
        if (entity instanceof PrimaryKeyed) {
            identifier = String.valueOf(((PrimaryKeyed) entity).getId());
        } else {
            identifier = entity.toString();
        }
    
        return MessageFormat.format(messageFormat, identifier);
    }
    

    Обратите внимание, что PrimaryKeyed — это настраиваемый интерфейс, который используется в наших сущностях. У нас также есть некоторые другие интерфейсы и нестандартная обработка, не показанные выше.

    09.09.2013
  • В каком классе сидят эти два метода? Мое пользовательское ограничение с context.buildConstraintViolationWithTemplate("{no.mobitroll.rest.resources.entities.beans.validators.QuizType.enum}").addConstraintViolation(); еще не интерполирует значение. 06.11.2015
  • @Stephane У нас есть они в классе обработчика исключений верхнего уровня, что, вероятно, хорошо иметь в любом случае. Где вы добавите это, действительно зависит от вашей архитектуры и используемых вами фреймворков, поэтому, к сожалению, я не могу дать более конкретный ответ. 30.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..