Использование Interceptor с аннотацией в Struts2 с плагином Spring и Convention

Я пытался использовать перехватчик с аннотацией в struts2 для обработки моего запроса и ответов, чтобы я мог выполнять некоторые действия до и после.

Но я изначально использовал struts 2 с плагином соглашения, который я не могу изменить. Моя структура также включает в себя Spring.

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

SEVERE: Exception starting filter struts2
Unable to load configuration. - [unknown location]
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:483)
....
Caused by: Unable to load configuration. - [unknown location]
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
.....
Caused by: Unable to find interceptor class referenced by ref-name mylogging - [unknown location]

Моя структура кода довольно проста:

Класс действий выглядит так:

@InterceptorRefs({  
    @InterceptorRef("mylogging")  
}) 
    public class LoginAction implements ModelDriven{
.....
    @Action(value="/login",results={@Result(name="success",location="/jsp/successPage.jsp"),
                @Result(name="login",location="/jsp/userLogin.jsp")})
        public String execute() {
....

Struts.xml:

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.ui.theme" value="simple" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
    <package  name="default"  namespace="" extends="struts-default">


     <interceptors>
            <interceptor name="mylogging" 
                class="com.lab.interceptor.LoggingInterceptor">
            </interceptor>
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="mylogging" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
    </package>
</struts>

Тело моего дескриптора развертывания (web.xml):

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <init-param>
            <param-name>actionPackages</param-name>
            <param-value>com.lab.actions</param-value>
        </init-param>
  </filter>


  <filter-mapping>

    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/resources/config/SpringBeans.xml</param-value>
</context-param>

   <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>

  </listener>

Теперь, надеюсь, это поможет выяснить, почему выбрасывается это исключение, потому что я не думаю, что мне нужно удалять реализацию ModelDriven из моего действия.

Заранее спасибо


person user2607985    schedule 22.07.2013    source источник
comment
Где вы объявляете, что ваше действие находится в пакете "default"?   -  person Dave Newton    schedule 22.07.2013
comment
@DaveNewton Я не понял тебя, но я думаю, что ‹имя пакета=пространство имен по умолчанию= extends=struts-default›   -  person user2607985    schedule 23.07.2013
comment
Это определяет пакет, но это не то место, где ваши действия волшебным образом появятся, если вы не укажете, к чему относится действие.   -  person Dave Newton    schedule 23.07.2013
comment
@DaveNewton stackoverflow.com/questions/16621970/ сообщает, что имя пакета не зависит от пакета, в котором существуют мои действия, поэтому это просто осмысленное имя...   -  person user2607985    schedule 23.07.2013
comment
... Перехватчики определяются внутри пакетов S2 (не Java). Если ваше действие находится в другом пакете S2 (не Java), оно ничего не знает об этих перехватчиках (если, конечно, пакет действия S2 (не Java) не расширяет пакет S2 (не Java), содержащий перехватчики). Так. Как вы думаете, в каком пакете S2 (не Java) должно быть ваше действие? Подсказка: это не значение по умолчанию, где определен ваш перехватчик.   -  person Dave Newton    schedule 23.07.2013
comment
Я загрузил изображение здесь postimg.org/image/yd7k1ddfp, потому что я не очень известен разместить изображение как Просто новый столяр. Таким образом, область с красной меткой предназначена для перехватчиков, а область с черной меткой - для действий.   -  person user2607985    schedule 23.07.2013
comment
Какое это имеет отношение к чему-нибудь? Я специально различал пакеты S2 и пакеты Java.   -  person Dave Newton    schedule 23.07.2013
comment
Ну, я думаю, что не понимаю вашей точки зрения. Пакеты S2 означают, что пакеты struts 2 - это что-то другое, а пакеты Java - это пакеты, в которых я храню весь свой код. Я поделился полной структурой каталогов...   -  person user2607985    schedule 23.07.2013
comment
Видите ли вы в конфигурации struts, где вы используете слово package в качестве элемента конфигурации XML?   -  person Dave Newton    schedule 23.07.2013
comment
Да, очевидно, это там   -  person user2607985    schedule 23.07.2013


Ответы (1)


По умолчанию подключаемый модуль Convention использует собственный пакет convention-default, который не содержит вашего пакета, определенного в struts.xml. Чтобы изменить это, у вас есть два варианта, описанных в документации [1]:

  • использовать аннотацию @ParentPackage
  • или определить <constant name="struts.convention.default.parent.package" value="default"/> в struts.xml

[1] http://struts.apache.org/development/2.x/docs/convention-plugin.html#ConventionPlugin-ParentPackageannotation

person Lukasz Lenart    schedule 23.07.2013