Перехватчик хранилища сообщений Struts 2 не работает с ошибкой поля (используется проверка Hibernate)
У меня есть Jsp с некоторыми текстовыми полями, они проверяются с использованием аннотации проверки Hibernate (@Valid или @NotNull в действии), за исключением одного (входной файл изображения), который проверяется с помощью проверки Struts2 по умолчанию (с использованием ActionName-validation.xml). Я хочу перенаправить на другое действие, когда отправленная форма недействительна (когда текстовые поля имеют значение NULL), и я хочу сохранить ошибки поля.
Я пытался с этим:
<interceptors>
<interceptor name="SessionCheckInterceptor" class="util.SessionCheckInterceptor"/>
<interceptor-stack name="mySessionValidationStack">
<interceptor-ref name="defaultStackHibernate" />
<interceptor-ref name="SessionCheckInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mySessionValidationStack"/>
<action name="insert" class="actions.InsertAction" >
<interceptor-ref name="mySessionValidationStack">
<param name="fileUpload.allowedTypes">image/png</param>
</interceptor-ref>
<interceptor-ref name="store">
<param name="operationMode">STORE</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result name="success" type="tiles" >baseLayout</result>
<result name="error" type="redirectAction" >
<param name="actionName">showinsertform</param>
</result>
<result name="input" type="redirectAction" >
<param name="actionName">showinsertform</param>
</result>
</action>
<action name="showinsertform" class="actions.ShowInsertFormAction" >
<interceptor-ref name="mySessionValidationStack" />
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<result name="success" type="tiles" >insert</result>
<result name="error" type="tiles" >baseLayout</result>
</action>
Но когда я отправляю данные в форму, перенаправление завершается успешно, не показывая мне сообщения об ошибках полей. Может я неправильно устанавливаю перехватчик? Используя hibernate мне нужно что-то переопределить? Если я пытаюсь вручную установить сообщения об ошибках в действии (с помощью addActionError), они работают! Может ли быть так, что сообщения об ошибках в спящих полях не сохраняются в сеансе?
1 ответ
Плагин Hibernate struts-plugin.xml здесь вы используете defaultStackHibernate, который не включает перехватчик хранилища, который определен в struts-default.xml, вы должны включить перехватчик хранилища в свой пользовательский стек перехватчиков перед его использованием.
<?xml version="1.0" encoding="UTF-8" ?>
<package name="hibernate-default" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="hibernateSessionInterceptor" class="com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor" />
<interceptor name="hibernateValidatorInterceptor" class="com.googlecode.s2hibernate.struts2.plugin.s2hibernatevalidator.interceptor.HibernateValidatorInterceptor">
<param name="excludeMethods">input,prepare,back,cancel,browse</param>
</interceptor>
<interceptor-stack name="defaultStackNoValidation">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
<interceptor-stack name="basicStackHibernate">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="hibernateSessionInterceptor"/>
</interceptor-stack>
<interceptor-stack name="defaultStackHibernate">
<interceptor-ref name="defaultStackNoValidation"/>
<interceptor-ref name="hibernateSessionInterceptor"/>
<interceptor-ref name="hibernateValidatorInterceptor"/>
</interceptor-stack>
<interceptor-stack name="defaultStackHibernateStrutsValidation">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="hibernateSessionInterceptor"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStackHibernate"/><!--
<global-exception-mappings>
<exception-mapping exception="org.hibernate.validator.InvalidStateException" result="input" name="input"/>
</global-exception-mappings>
--></package>
<package name="hibernateManager" namespace="/hibernateManager" extends="struts-default">
<interceptors>
<interceptor name="hibernatePluginInterceptor" class="com.googlecode.s2hibernate.struts2.plugin.interceptors.InternalHibernatePluginInterceptor" />
<interceptor name="managerInterceptor" class="com.googlecode.s2hibernate.struts2.plugin.interceptors.HibernateManagementInterceptor" />
</interceptors>
<default-class-ref class="com.googlecode.s2hibernate.struts2.plugin.actions.HibernateManagementAction"/>
<action name="" method="index">
<interceptor-ref name="hibernatePluginInterceptor"/>
<interceptor-ref name="managerInterceptor"/>
<interceptor-ref name="validationWorkflowStack"/>
<result>/WEB-INF/temp/hibernatePlugin/management.jsp</result>
<result name="input">/WEB-INF/temp/hibernatePlugin/management.jsp</result>
</action>
<action name="*" method="{1}">
<interceptor-ref name="hibernatePluginInterceptor"/>
<interceptor-ref name="managerInterceptor"/>
<interceptor-ref name="validationWorkflowStack"/>
<result>/WEB-INF/temp/hibernatePlugin/management.jsp</result>
<result name="input">/WEB-INF/temp/hibernatePlugin/management.jsp</result>
</action>
</package>