Значения ошибки поля struts 2 не отображаются

я переопределяю метод проверки и добавляю ошибки, используя addFieldError("test", "test print");

а в jsp использовал <s:fielderror />

но ошибки не отображаются в input.jsp.

Также мой тип контента jsp <%@ page contentType="text/html; charset=UTF-8"%>

Мой struts.xml похож на

            <action name="test" class="ListInfo">
                 <result>/input.jsp</result>
            </action>

    <action name="Proceed" class="Details">
    <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="execAndWait">
                <param name="delay">100</param>
            </interceptor-ref>
           <result name="wait">Wait.jsp</result>
        <result name="success">/Summary.jsp</result>
        <result name="input" type="chain">test</result>
        <result name="failure" type="chain">test</result>
    </action>

person saket    schedule 05.04.2012    source источник
comment
Я не помню, сохраняются ли ошибки действий во время цепочки по умолчанию. Цепочка почти всегда плохая, кстати.   -  person Dave Newton    schedule 05.04.2012
comment
@DaveNewton: хороший момент, я полностью пропустил это :)   -  person Umesh Awasthi    schedule 05.04.2012
comment
@saket Лучший подход вместо использования цепочки, перенаправление на тестовое действие и использование перехватчика messageStore для сохранения ошибок действий и полей.   -  person MohanaRao SV    schedule 05.04.2012
comment
Ошибки в полях должны указываться по имени... вы правильно указываете имя в поле?   -  person Quaternion    schedule 05.04.2012
comment
При наличии ответа с использованием цепочки хранилище сообщений переносит сообщения только в том случае, если OP хочет, чтобы другая цепочка вычисляемых значений по-прежнему требовалась (ну... как требуется, так как перенаправляется любым способом).   -  person Quaternion    schedule 06.04.2012
comment
@DaveNewton, Chaining, если это плохая практика, то почему struts2 все еще ее поддерживает. Я думаю, это должно быть устаревшим.   -  person MohanaRao SV    schedule 06.04.2012
comment
@MohanaRaoSV Обратная совместимость во-первых, и, как я уже сказал, это почти плохая идея. Это тот случай, когда это почти наверняка плохая идея, потому что есть другое решение.   -  person Dave Newton    schedule 06.04.2012


Ответы (2)


Оказывается, ошибки (поле и действие НЕ сохраняются в цепочке.

Это доказывает следующее (предполагается, что struts2-conventions-plugin-VERSION):

Действие foo всегда связано с панелью действий (поэтому нам нужно представление только для панели действий)

Действие foo

package com.quaternion.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Result;

/** #1 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/

@Result(name="input", type="chain", location="bar")
public class Foo extends ActionSupport{
    private String name;

    @Override
    public void validate(){
        super.addActionError("Just an action error");
        super.addFieldError("name", "Name is all ways wrong... for no good reason.");
    }

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name = name;
    }
}

Панель действий

package com.quaternion.action;

import com.opensymphony.xwork2.ActionSupport;

/** #2 SOMETHING WILL BE ADDED HERE TO FIX THE ISSUE**/

public class Bar extends ActionSupport{  
}

представление для панели: /WEB-INF/content/bar.jsp

<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <body>
        <h1>Action Bar</h1>
        <s:actionerror/>
        <s:fielderror name="name"/>
    </body>
</html>

Тестируя вышеизложенное, мы видим, что в ошибках ничего не отображается.

Чтобы решить эту проблему, мы используем перехватчик хранилища: http://struts.apache.org/2.0.14/struts2-core/apidocs/org/apache/struts2/interceptor/MessageStoreInterceptor.html

В первом действии (#1) нам нужно будет добавить аннотации и импорт для их поддержки:

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;

@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode","STORE"}),
    @InterceptorRef("defaultStack"),
})

Во втором действии (#2) нам нужно будет добавить аннотации и импорт для их поддержки:

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;

@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode","RETRIEVE"}),
    @InterceptorRef("defaultStack"),
})

И теперь это работает.

person Quaternion    schedule 05.04.2012
comment
Привет, я изменил свой struts.xml следующим образом: ` ‹имя действия=тестовый класс=ListInfo› ‹interceptor-ref name=store› ‹param name=operationMode›RETRIEVE‹/param› ‹/interceptor-ref› ‹interceptor-ref name= defaultStack/› ‹result›/input.jsp‹/result› ‹/action› ‹имя действия=Proceed class=Details› ‹interceptor-ref name=store› ‹param name=operationMode›STORE‹/param› ‹/interceptor- ref› ‹interceptor-ref name=defaultStack/› ‹result name=success›/Summary.jsp‹/result› ‹result name=input type=chain›test‹/result› ‹/action›`, но он перенаправляется правильно, но все же не показывает ошибки. - person saket; 06.04.2012
comment
в методе проверки addFieldError("Description", "Error should be printed"); в jsp <s:fielderror name="Description"/> - person saket; 06.04.2012
comment
спасибо, это работает .. Я попробовал это на простом примере .. но он не работает, когда я включаю свой header.jsp. можете подсказать что может быть не так.. - person saket; 06.04.2012
comment
цепной перехватчик разрешает сохранение ошибок полей и ошибок/сообщений действий, как описано в документах. - person Dave Newton; 06.04.2012
comment
Если у OP есть привычка к цепочке... тогда универсальный подход к перехватчику цепочки может вызвать проблемы. Есть причина, по которой перенос ошибок не является общим случаем, проверка одного действия может не часто иметь много общего с проверкой второго... В этом случае все же использование хранилища является более конкретным. С точки зрения пользователя было бы лучше, если бы у них было конгруэнтное поведение в этом вопросе. - person Quaternion; 06.04.2012
comment
@DaveNewton Гах, вещи продолжают меняться, но в хорошем смысле ... самая актуальная ссылка: struts.apache.org/2.3.1.2/docs/chaining-interceptor.html показывает, что поведение теперь соответствует! - person Quaternion; 23.04.2012

Если вы все равно собираетесь использовать цепочку действий (которая, по IMO, почти никогда не требуется, почти никогда не является хорошей идеей и почти всегда приводит к непреднамеренной связи между действиями), используйте то, что перехватчик цепочки уже предоставляет и избегает настройки чего-либо, кроме "цепочки".

Согласно документам:

  • struts.xwork.chaining.copyErrors — установите значение true, чтобы скопировать ошибки действий
  • struts.xwork.chaining.copyFieldErrors — установите значение true, чтобы скопировать ошибки поля
  • struts.xwork.chaining.copyMessages — установите значение true, чтобы скопировать сообщения о действиях
person Dave Newton    schedule 06.04.2012
comment
Я установил для struts.xwork.chaining.copyErrors значение true в своем приложении, а затем всякий раз, когда я добавляю некоторые ошибки через addActionError(), Struts2 будет искать ввод вместо результата, возвращаемого методом действия. Есть идеи? - person Will; 19.07.2016
comment
@Will Перехватчик рабочего процесса по умолчанию, IIRC, перейдет к результату "input" при наличии ошибок. Так что, похоже, это работает по замыслу. (Честно говоря, я, возможно, не правильно помню.) - person Dave Newton; 20.07.2016