Перехватчик не вызывается в Struts

Мой перехватчик (validation) не вызывается ни до, ни после действия. Любые идеи, как заставить его работать?

Примечание. Каждый раз, когда вызывается перехватчик по умолчанию.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <package name="default" namespace="/" extends="struts-default,json-default">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
      <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    </result-types>

    <interceptors>
       <interceptor name="validation" class="ValidatorBaseAction"/>
      <interceptor-stack name="default">
        <interceptor-ref name="logger"/>
      </interceptor-stack>
      <interceptor-stack name="validationStack">
         <interceptor-ref name="validation"/>
         <interceptor-ref name="default"/>
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="default" />

    <action
        name="viewRequest"
        class="ViewAction"
        method="execute">
      <interceptor-ref name="validationStack" /> 
      <result name="input" type="redirectAction">explore</result>
      <result name="success" type="redirect">/showRequest.do?${explorerParameters}</result>
    </action>
  </package>
</struts>

person Amber    schedule 05.05.2015    source источник
comment
Какой перехватчик не вызывается?   -  person Rookie007    schedule 05.05.2015
comment
Вы пробовали с этим <interceptor-stack name="validationStack"> <interceptor-ref name="default"/> <interceptor-ref name="validation"/> </interceptor-stack>   -  person Rookie007    schedule 05.05.2015
comment
Откуда ты знаешь, что он не называется?   -  person Roman C    schedule 05.05.2015
comment
Имя стека по умолчанию — defaultStack.   -  person Aleksandr M    schedule 05.05.2015


Ответы (1)


Главная проблема:

  • class как для действий, так и для перехватчиков необходимо указывать FQCN, а не только имя. Затем измените его на что-то вроде:

    <interceptor name="validation" class="com.foo.bar.ValidatorBaseAction"/>
    

    а также измените свое действие на

    <action name="viewRequest" class="com.foo.bar.ViewAction" method="execute">
    

Побочные проблемы:

  • Не называйте его ValidatorBaseAction, если это Interceptor, назовите его ValidatorBaseInterceptor. И убедитесь, что внутри него нет ничего Action;
  • Не используйте стек перехватчиков только с одним перехватчиком, я почти уверен, что в 99% случаев это будет бесполезно. Если вы не уверены, просто используйте defaultStack, добавив в него свой перехватчик.

Полировка:

  • json-default уже расширяет struts-default, так что это

    <package ... extends="struts-default,json-default"
    

    эквивалентен этому

    <package ... extends="json-default"
    

    это чище;

  • Поскольку вы расширяете json-default, вам не нужно переопределять результат JSON, а затем удалять

    <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    

    это бесполезно.

  • Старайтесь всегда отдавать предпочтение результату redirectAction при перенаправлении на действие и используйте результат redirect только при перенаправлении на другие ресурсы или внешние URL-адреса.

person Andrea Ligios    schedule 05.05.2015
comment
Я только что удалил FQCN из фрагмента, который у меня есть. На самом деле они есть в моем коде. Также я не мог добавить валидацию в стек по умолчанию, так как она мне нужна только для выборочных действий. - person Amber; 05.05.2015
comment
Ваше последнее предложение не имеет смысла, пожалуйста, объясните его лучше - person Andrea Ligios; 05.05.2015
comment
Я не мог добавить свой перехватчик в стек по умолчанию, так как стек по умолчанию используется гораздо большим количеством действий, и мне нужен мой перехватчик только в подмножестве этих действий. - person Amber; 06.05.2015
comment
Абсолютно! Просто включите в свой validationStack перехватчик проверки И defaultStack вместо минимального стека по умолчанию, состоящего только из одного перехватчика. стек по умолчанию != по умолчанию.... - person Andrea Ligios; 06.05.2015
comment
Проблема в том, что даже после того, как я явно использую свой перехватчик проверки в действии, вызывается тот, который используется по умолчанию. Если я изменю default-interceptor-ref, только тогда будет вызван мой перехватчик. - person Amber; 06.05.2015
comment
Это странно... 1) Не произвольно удаляйте вещи при публикации кода, который не работает (вы удалили что-то еще, что мы должны знать?) 2) Как вы узнаете, что ваш перехватчик не вызывается? 3) Откуда вы знаете, что вызывается стек по умолчанию (ВАШ по умолчанию, а не реальный стек по умолчанию)? 4) Всегда используйте уникальные имена. validation — это имя другого перехватчика. Кстати, если проблема не устранена, рассмотрите возможность публикации вашего Interceptor, класса действий, полной конфигурации struts и web.xml. - person Andrea Ligios; 06.05.2015