arturich
@arturich

Как лучше сделать hibernate валидацию с кодами ошибок?

Всем привет!

У меня есть SAAS проект, на нем я решил использовать hibernate validation (4.3.0.Final).
Проблема в том, что мой SAAS по сути предоставляет только API и клиентам надо понимать - что за ошибка пришла в ответ на их запрос. Кидать в ответ текст, типа "%field% must be not null" или "javax.validation.constraints.NotNull.message" считаю неверно, так как в первом варианте, юзать вобще невозможно, во втором как-то не прикольно, так как сильно зависит от реализации. В общем-то только какие-то константы или перечисления позволят клиенту точно понимать что пришло в ответ.

Подумал, что можно реализовать что-то вроде того, что есть у гугла в одной из из систем (https://developers.google.com/adwords/api/docs/ref...
В связи с этим подумал как-то enum-ы заюзать вместо message.
Но что-то вроде:
@NotNull(message = MaterialType.IMAGE)
Естественно java делать не дает, так как стандартный NotNull предполагает String в message.

После подумал о классе с статическими свойствами:
public static class Constants {
	public static final String IMAGE = "IMAGE";
}

но мне и это показалось неудачным вариантом.

На уме несколько решений проблемы:
1) Свой валидатор для всех моделей
2) Изощрения с хранением "public static final String IMAGE = "IMAGE";"
3) Свои реализации NotNull, и пр. стандартных, где можно будет указать ту самую константу ошибки

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

В итоге должно получиться что-то вроде - список ошибок(структур):
* fieldPath - поле, вызвавшее ошибку
* trigger - что именно вызвало ошибку
* errorString - текст ошибки для понятности
* type - тот самый enum типа (NOT_NULL, MIN и пр)

Посоветуйте пожалуйста как решить проблему, уверен, что она, так скажем, не нова.
  • Вопрос задан
  • 3114 просмотров
Решения вопроса 1
FanKiLL
@FanKiLL
NotNull не только предполагает String а ещё что это будет константа, вернее так предполагает любая аннотация которая ждёт String.

public enum MessageType {
    NOTNULL("not null!!!"), MINVALUE("min value must be ...");

    private final String message;

    private MessageType(final String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    @Override
    public String toString() {
        return this.message;
    }
}


И вызвать потом
@NotNull(message = MessageType.NOTNULL.getMessage())
private String userName;

Такой финт ушами не пройдёт. Даже MessageType.NOTNULL.name() метод который возвращает имя Enum'a не пройдёт.

public class ValidationConstants {

    private ValidationConstants() {} //Приватный конструктор, что бы нельзя было сделать new
	
    public static final String NOT_NULL = "Not nuull...";
    public static final String MIN_VALUE = "Min value must be...";
}


Вот такое вполне прокатит
@NotNull(message = ValidationConstants.NOT_NULL)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы