Обработка нескольких сообщений об ошибках аннотаций проверки

Я пробую проверки в SpringMVC, используя аннотации...

Я использовал 2 аннотации для поля для проверки

@NotEmpty(message="обязательно")

@Size(min="3" max="8" message="Вне диапазона")

закрытый строковый пароль

Проблема, с которой я сталкиваюсь, заключается в том, что когда поле остается пустым, отображаются оба сообщения об ошибках (* обязательные, а также вне диапазона). Но я хочу отобразить одно из этих сообщений об ошибке, а не оба...

Можно ли ограничиться одним сообщением? Если да, то каковы возможности для этого сценария?

Любые предложения и рекомендации приветствуются.. Заранее спасибо...


person sree    schedule 25.02.2013    source источник


Ответы (2)


Я столкнулся с той же проблемой, поэтому я создал собственный тег ошибок, который отображает только первую ошибку — не стесняйтесь использовать его:

a] Создать собственный класс тегов

package cz.devmint.springext.web.tags.form;

import javax.servlet.jsp.JspException;

import org.apache.commons.lang.StringUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.tags.form.ErrorsTag;
import org.springframework.web.servlet.tags.form.TagWriter;

public class ErrorsTagExt extends ErrorsTag {

private boolean firstErrorOnly = true;

public boolean isFirstErrorOnly() {
    return firstErrorOnly;
}

public void setFirstErrorOnly(boolean firstErrorOnly) {
    this.firstErrorOnly = firstErrorOnly;
}

@Override
protected void renderDefaultContent(TagWriter tagWriter) throws JspException {
    tagWriter.startTag(getElement());
    writeDefaultAttributes(tagWriter);
    String delimiter = ObjectUtils.getDisplayString(evaluate("delimiter", getDelimiter()));
    String[] errorMessages = getBindStatus().getErrorMessages();
    for(int i = 0; i < errorMessages.length; i++) {
        String errorMessage = errorMessages[i];
        if (i > 0) {
            tagWriter.appendValue(delimiter);
        }
        tagWriter.appendValue(getDisplayString(errorMessage));
        if (firstErrorOnly) break;
    }
    tagWriter.endTag();
}

b] Чтобы использовать пользовательский тег, вам необходимо создать дескриптор библиотеки тегов — вы можете просто скопировать объявление ErrorsTag из дескрипторов библиотеки тегов Spring (spring-webmvc-3.2.1.RELEASE.jar в каталоге META-INF под именем spring-form.tld) и добавить свой собственный атрибут firstErrorOnly. Ниже приведен полный пример, извлеченный из моей библиотеки — см. комментарии в коде, что можно изменить и настроить:

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

<description>Custom extension to Spring Framework JSP Tag Library</description>
<tlib-version>3.0</tlib-version>
<short-name>tags</short-name>
<!-- use your own uri -->
<uri>http://cz.devmint.spring-ext/tags</uri>
<tag>
    <description>Renders field errors in an HTML 'span' tag.</description>
    <name>errors</name>
    <!-- use your own package - fully qualified name of your tag class  -->
    <tag-class>cz.devmint.springext.web.tags.form.ErrorsTagExt</tag-class>
    <body-content>JSP</body-content>
    <variable>
        <name-given>messages</name-given>
        <variable-class>java.util.List</variable-class>
    </variable>
    <!-- this attribute declaration is the only change when compare with spring's original tag definition -->   
    <attribute>
        <description>Whether to render the first error for given field only</description>
        <name>firstErrorOnly</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <description>Path to errors object for data binding</description>
        <name>path</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Standard Attribute</description>
        <name>id</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>Enable/disable HTML escaping of rendered values.</description>
        <name>htmlEscape</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>Delimiter for displaying multiple error messages. Defaults to the br tag.</description>
        <name>delimiter</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>Equivalent to "class" - HTML Optional Attribute</description>
        <name>cssClass</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>Equivalent to "style" - HTML Optional Attribute</description>
        <name>cssStyle</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Standard Attribute</description>
        <name>lang</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Standard Attribute</description>
        <name>title</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Standard Attribute</description>
        <name>dir</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Standard Attribute</description>
        <name>tabindex</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onclick</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>ondblclick</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onmousedown</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onmouseup</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onmouseover</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onmousemove</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onmouseout</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onkeypress</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onkeyup</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>HTML Event Attribute</description>
        <name>onkeydown</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <description>Specifies the HTML element that is used to render the enclosing errors.</description>
        <name>element</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <dynamic-attributes>true</dynamic-attributes>
</tag>
</taglib>

Поместите этот XML-файл в WEB-INF/tld/spring-ext.tld

На странице jsp добавьте объявление:

<%@taglib prefix="spring-ext" uri="http://cz.devmint.spring-ext/tags" %>    

Вместо весеннего ErrorsTag используйте собственный тег:

<spring-ext:errors path="dummy" firstErrorOnly="true" /> 
person Pavla Nováková    schedule 25.02.2013
comment
Привет, я могу понять код, который вы дали, но мне жаль, что я не знаю, где использовать этот код и как сопоставить его с тегом ошибок. Мне очень жаль, что я новичок в Spring. , Не могли бы вы немного объяснить, как использовать этот код, пожалуйста... - person sree; 26.02.2013
comment
Хорошо, я добавил полный код и объяснение конкретных шагов. - person Pavla Nováková; 26.02.2013
comment
Большое спасибо, вы сделали мой день счастливым, и вы проделали отличную работу, и она работает так, как я ожидал. Еще раз спасибо за то, что вы поделились знаниями ... - person sree; 27.02.2013
comment
Мне очень жаль, user2003170, я не могу проголосовать за ваш ответ. У меня нет количества репутаций, чтобы голосовать... - person sree; 27.02.2013
comment
user2003170 как гарантировать порядок проверки свойства, если мы не определяем GroupSequence? Если мы этого не сделаем, каждый раз порядок проверки свойств будет случайным. - person Rocky Hu; 24.11.2014
comment
Порядок аннотаций/ограничений, связанных с проверкой, не может быть указан на момент написания этого комментария. Некоторое время назад я отправил вопрос, связанный с заказом, команде Hibernate Validator, проблема была принята и, вероятно, будет решена в следующем выпуске спецификации Bean Validation — см. более подробную информацию здесь: beanvalidation.org/proposals/BVAL-248 Кстати, в простых случаях вы можете избежать конфликта заказов, используя не конфликтующие комбинации аннотаций, например NotNull и Size-Size оцениваются как истина для нулевого значения. - person Pavla Nováková; 08.02.2015

Есть вопрос по этому поводу. Вы можете проверить следующую ссылку:

Весной Проверка MVC. Можно ли одновременно отображать только одно сообщение об ошибке для каждого поля?

person ahmetdursun    schedule 25.02.2013
comment
Спасибо за ваш ответ ahmetdursun ... Я видел ссылку, которую вы разместили, в этом случае они использовали интерфейс и собственную проверку, поэтому они использовали «@ReportAsSingleViolation», но в моем случае я использую предопределенную аннотацию исключения в классе, где я не могу разместить « Аннотация @ReportAsSingleViolation... Есть ли другой способ? - person sree; 25.02.2013