Включение плагина соглашения прерывает сопоставление xml

У меня есть старый проект, в котором используются сопоставления struts2, настроенные в формате xml. Я хотел сделать его немного свежее и использовать сопоставление аннотаций, как это было бы в весеннем mvc. Итак, я обнаружил, что struts2 позволяет это. Но после того, как я добавил

    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-convention-plugin</artifactId>
        <version>${org.apache.struts.version}</version>
    </dependency>

в мой пом xml. Моя конфигурация xml перестала работать.

Вот что у меня есть в моем struts.xml:

    <action name="my/home" class="my.dhblah.MyAction">
        <result type="redirectAction">my/home/search</result>
    </action>

Я удалил плагин из maven pom. Я отлаживал стойки, и в DefaultActionInvocation.createResult() в строке proxy.getConfig() я вижу следующее:

result = {com.opensymphony.xwork2.config.entities.ActionConfig@10444}"{ActionConfig my/home (my.dhblah.MyAction) - null}"
interceptors = {java.util.Collections$UnmodifiableRandomAccessList@10447} size = 20
params = {java.util.Collections$UnmodifiableMap@10448} size = 0
results = {java.util.Collections$UnmodifiableMap@10449} size = 2
exceptionMappings = {java.util.Collections$UnmodifiableRandomAccessList@10450} size = 1
className = {java.lang.String@10451}"my.dhblah.MyAction"
methodName = null
packageName = {java.lang.String@10452}"my"
name = {java.lang.String@10453}"my/home"
allowedMethods = {java.util.Collections$UnmodifiableSet@10454} size = 1
location = null

когда я расширяю раздел "results", я вижу два сопоставления результатов "success" и "exception"

После включения плагина в pom.xml я вижу в той же строке следующее:

config = {com.opensymphony.xwork2.config.entities.ActionConfig@10457}"{ActionConfig home (my.dhblah.MyAction.execute()) - null}"
interceptors = {java.util.Collections$UnmodifiableRandomAccessList@10460} size = 18
params = {java.util.Collections$UnmodifiableMap@10461} size = 0
results = {java.util.Collections$UnmodifiableMap@10462} size = 0
exceptionMappings = {java.util.Collections$UnmodifiableRandomAccessList@10463} size = 0
className = {java.lang.String@10464}"my.dhblah.MyAction"
methodName = {java.lang.String@10395}"execute"
packageName = {java.lang.String@10465}"my.dhblah#convention-default#/my"
name = {java.lang.String@10466}"home"
allowedMethods = {java.util.Collections$UnmodifiableSet@10467} size = 1
location = null

и после того, как я нажму на этот URL, у меня будет следующая ошибка:

Struts Problem Report

Struts has detected an unhandled exception:

Messages:   
No result defined for action my.dhblah.MyAction and result success
Stacktraces

No result defined for action my.dhblah.MyAction and result success
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)

Я не добавлял @Actionаннотацию к MyAction, но похоже, что плагин-конвенция подбирает старые классы Action и строит конфигурацию сопоставления до того, как просматривает конфигурацию xml, поэтому у меня возникает ошибка, что ничего не сопоставлено с результатом "success".

Была ли у кого такая проблема и как ее решить?


person dhblah    schedule 12.09.2014    source источник
comment
I wanted to make it a bit fresher and use annotations mapping вам следует удалить всю старую конфигурацию XML и поместить аннотации везде, где это необходимо. В противном случае соглашение будет сканировать каждое действие, а не только аннотированные, и искажать конфигурацию.   -  person Andrea Ligios    schedule 12.09.2014
comment
Да, похоже, это проблема, я проверил с помощью плагина config для браузера, и оказалось, что в дополнение к действиям, определенным в struts.xml, есть также такие же действия, сопоставленные с различными пространствами имен, созданными плагином соглашения. Я постараюсь сделать так, чтобы конвенционный плагин не искал неаннотированные классы.   -  person dhblah    schedule 12.09.2014
comment
ММММММмммммхххх. Вы берете проект без аннотации и конфигурации xml, добавляете плагин соглашения, избегаете рефакторинга старого xml в новые аннотации, а затем пытаетесь взломать плагин соглашения, чтобы обойти старые классы... звучит как Bad Idea™ для меня. Если вы делаете небольшие обновления проекта, придерживайтесь старой конфигурации xml. Если вам нужно удвоить размер проекта, выполните рефакторинг всего... оба способа чище и совместимы с KISS   -  person Andrea Ligios    schedule 12.09.2014


Ответы (1)


Это разные конфигурации действий. Однако когда вы сопоставляете свое действие с помощью конфигурации Struts, логика получения сопоставления действий реализуется и выполняется сопоставителем действий. Существует стандартная реализация оператора сопоставления действий, который используется по умолчанию. Вы должны знать, что плагин соглашения добавляет свою конфигурацию к конфигурации xml. Таким образом, у вас могут быть дублирующиеся действия, настроенные во время выполнения. Трудно предсказать, какие элементы конфигурации будут выбраны средством сопоставления действий для построения сопоставления действий. Для решения подобных проблем с конфигурацией вы можете использовать модуль Config Browser. .

Config Browser — это простой инструмент для просмотра конфигурации Struts во время выполнения. Это очень полезно при отладке проблем, которые могут быть связаны с проблемами конфигурации.

Чтобы установить плагин, просто добавьте его в зависимость

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-config-browser-plugin</artifactId>
    <version>${org.apache.struts.version}</version>
</dependency>

Этот подключаемый модуль можно установить, скопировав jar-файл подключаемого модуля в каталог /WEB-INF/lib вашего приложения.

person Roman C    schedule 12.09.2014