2014-01-10 2 views
1

Предположим, что в классе действия есть поле типа BigDecimal.Короткое замыкание в проверке Struts2

@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.

+0

Вы видите только ошибки или хотите предотвратить валидации? –

+0

Да, я говорю о профилактике. Только по одному. Остальное нужно игнорировать. Если преобразование завершается неудачно, нет смысла проверять какие-либо проверки (проверки). Если преобразование завершается успешно, проверки должны выполняться в определенном порядке, сначала должны быть проверены первые пустые поля, если это удастся, значение должно быть проверено на диапазон/длину и так далее. Если одно подтверждение не выполняется, остальные должны быть проигнорированы. Это можно сделать? – Tiny

ответ

1

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

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

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

+0

Я сейчас в другом месте и не могу попробовать. Я попробую это позже (два или более дней позже). Благодарю. – Tiny

+0

** Off topic: ** Могу ли я узнать, как у вас есть 41 голос в день (по крайней мере, до сегодняшнего дня)? Дневной лимит голосования составляет 40 (максимум). – Tiny

+0

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

Смежные вопросы