Короткое замыкание в проверке Struts2

Предположим, что есть поле типа BigDecimal в классе действий следующим образом.

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
public final class TestAction extends ActionSupport
{
    private BigDecimal price;

    //Setter and getter.        

    @Validations(
    requiredFields = {
        @RequiredFieldValidator(fieldName = "price", type = ValidatorType.FIELD, message = "Price is mandatory.")},
    fieldExpressions = {
        @FieldExpressionValidator(fieldName = "price", expression = "price>0", shortCircuit = true, message = "Price cannot be less than or equal to zero.")})
    @Action(value = "Add",
    results = {
        @Result(name = ActionSupport.SUCCESS, type = "redirectAction", params = {"namespace", "/admin_side", "actionName", "Test"}),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "defaultStack", params = {"params.acceptParamNames", "price", "validation.validateAnnotatedMethodOnly", "true"})
    })
    public String insert() {
        return ActionSupport.SUCCESS;
    }

    //This method is worth nothing. It is used just to return an initial view on page load.
    @Action(value = "Test",
    results = {
        @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "defaultStack", params = {"params.acceptParamNames", "", "params.excludeMethods", "load", "validation.validateAnnotatedMethodOnly", "true"})})
    public String load() throws Exception {
        return ActionSupport.SUCCESS;
    }
}

И следующая форма.

<s:form namespace="/admin_side" action="Test" id="dataForm" name="dataForm">
    <s:fielderror fieldName="price"/>
    <s:textfield id="price" name="price"/>

    <s:submit value="Submit" action="Add"/>
</s:form>

Я хочу достичь,

  1. Если поле оставить пустым, то единственное сообщение Цена обязательно. должен отображаться через @RequiredFieldValidator
  2. Если вводится нечисловое значение, например "abc", оно должно отображать только сообщение об ошибке преобразования из файла свойств.
  3. Если предпринимается отрицательное значение, единственное сообщение Цена не может быть меньше или равно нулю. должен появиться через @FieldExpressionValidator,

Одновременно должна появляться либо одна ошибка преобразования, либо одна ошибка проверки.

Это возможно? Я до сих пор не понимаю должным образом функцию shourtCircuit приписывать.

1 ответ

Решение

На первый взгляд так много не видел. Но, посмотрев на документы, я бы сказал, что есть способ обрабатывать ошибки преобразования. Путем добавления валидатора преобразования в конфигурацию, которая является валидатором короткого замыкания. Короткое замыкание означает, что если такой валидатор имеет ошибки, другие валидаторы пропускаются.

 conversionErrorFields = @ConversionErrorFieldValidator(fieldName = "price", message = "Price has invalid value", shortCircuit = true) 

поместите этот код под @Validations аннотаций.

Другие вопросы по тегам