Удаление Convention.annotation — заменить на config в struts.xml

У меня возникла проблема с удалением аннотаций плагинов @Action и @Result Convention из действия и заменой их эквивалентной конфигурацией в struts.xml.

package com.microed.cars.web;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

public class HomeAction extends ActionSupport {

    @Action(results = {
            @Result(location = "/jsp/home.jsp")
    })
    @Override
    public String execute() throws Exception {
        return super.execute();
    }
}

Когда эти аннотации есть, я могу успешно получить доступ к localhost:port/context/home.action

Когда я удаляю аннотации, я получаю ошибку struts «нет результата, определенного для действия.....», несмотря на то, что в struts.xml есть результат «захватить все» - весь struts.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.convention.package.locators" value="web"/>
    <constant name="struts.convention.default.parent.package" value="beetroot"/>

    <package name="beetroot" extends="json-default">

        <action name="home" class="homeAction">
            <result>/jsp/home.jsp</result>
        </action>

        <action name="cars" class="baseCarsAction">
            <result name="input" type="json">
                <param name="root">autoResults</param>
                /jsp/home.jsp
            </result>
        </action>
    </package>
</struts>

Он расширяет json-default, потому что мне нужен тип результата json для функции автозаполнения.

Я не знаю, почему он не получает сопоставление действий для класса homeAction. Я знаю, что struts.xml читается, потому что, если я удалю сопоставление действий «автомобили», автозаполнение отключится (но для этого нужны аннотации, которые я пытаюсь удалить, чтобы проверить это).

Я знаю, что «результат не определен» - это простая ошибка, обычно вызванная ошибками орфографии/прописных букв, но здесь это определенно не так, просто кажется, что игнорируется все «домашнее» сопоставление действий.

При переходе через DefaultActionInvocation.createResult вообще нет «результатов», с которыми можно попытаться сопоставить.


person Ken Alton    schedule 29.01.2013    source источник


Ответы (1)


В своем нынешнем виде объявление действия cars недействительно (и не имеет смысла, IMO):

<action name="cars" class="baseCarsAction">
  <result name="input" type="json">
    <param name="root">autoResults</param>
    <param name="location">/jsp/home.jsp</param>
  </result>
</action>

Тем не менее: если это результат JSON, JSP бесполезен, и он будет проигнорирован (или полностью отклонен, я не уверен, ошибка это или нет). Единственным результатом будет либо JSON, либо HTML.

Включите ведение журнала до уровня DEBUG, чтобы выявлять ошибки запуска и сужать диапазон возможных причин.

Если в вашем файле конфигурации Spring настроено baseAction (что необязательно, если вы используете аннотации Spring для внедрения), конфигурация для действия home действительна.

Я бы с осторожностью относился к развертыванию плагина соглашения, если вы на самом деле его не используете: он меняет способ сопоставления действий; это может повлиять на окружающее приложение и вызвать проблемы. Придерживайтесь одного или другого, избегайте обоих — это усложняет анализ причин поведения приложения.

Не имеет отношения, но я рекомендую размещать страницы JSP под /WEB-INF, чтобы запретить прямой доступ клиента.

person Dave Newton    schedule 29.01.2013
comment
Да, я удалил условные константы из struts.xml и теперь работает так, как ожидалось — возможно, что более важно — работает так, как я понимаю — мой опыт работы с аннотациями ограничен базовыми аннотациями Spring для внедрения зависимостей. Дэйв, твои знания впечатляют, и терпеливо помогать, как ты, чрезвычайно благородно. Благодарю вас! - person Ken Alton; 29.01.2013
comment
@KenAlton О, черт возьми; нет проблем. Поначалу это много, чтобы обернуть голову, но как только вы узнаете, где искать проблемы, все начнет вставать на свои места гораздо быстрее :) - person Dave Newton; 29.01.2013
comment
+1, хотя я решительно поддерживаю плагин struts2-conventions, странные вещи могут происходить вместе с сопоставлениями xml, а плагин config-browser-plugin запутывается и будет лгать. Судя по плагину, получить состояние действий не так-то просто. Обработка действий не является особенно унифицированной вещью, я действительно хотел бы, чтобы она была намного более унифицированной, потому что возможны некоторые интересные вещи, если вы можете точно (и легко) определить определенную обработку... и немного сложно изменить обработку struts2 во время выполнения время. Извините, в основном OT, но указывает, почему он не сотрудничает. - person Quaternion; 30.01.2013
comment
@Quaternion Я согласен; добавление пакета соглашения может привести к нелогичному поведению. Я не уверен, как лучше всего заставить плагин браузера сотрудничать, хотя теперь это может быть проще, когда есть механизм заказа плагинов (IIRC). Я могу поковыряться с этим как часть связанного побочного проекта; спасибо за наводку. - person Dave Newton; 30.01.2013
comment
@DaveNewton, что было бы действительно идеально, хотя я думаю, что это был бы кошмар. Было бы создать формальную модель данных (диаграмму ER) для конфигурации struts2, разрешить точке расширения хранить конфигурацию struts2 в БД (тогда плагин мог бы по умолчанию поддерживать параметр в памяти по умолчанию). Затем struts2 будет использовать эту единую модель для всех транзакций. Затем при обновлении модели новые запросы могут быть поставлены в очередь до тех пор, пока не будут завершены старые, а затем будет загружен новый запрос. В нынешнем виде вам нужно возиться с неизменяемыми коллекциями, это просто боль. - person Quaternion; 30.01.2013
comment
Я думаю, что внутренности struts2 можно было бы значительно очистить, а плагину браузера конфигурации нужно было бы только запрашивать внутреннее состояние, это было бы очень тривиально. Мне нужно было создать обработчик результатов Unknown, чтобы сделать что-то, что можно было бы легко исправить с помощью такой системы, каждый раз, когда кому-то нужно идти по этому пути, плагин config-browser не сможет понять, что происходит. - person Quaternion; 30.01.2013