Сохранение моего кода СУХИМ в действии Struts 2

Недавно я работал над небольшим проектом, который включает Struts 2 и Spring 3, и мой коллега написал очень ПЛОХОЙ код:

Мы должны реализовать два модуля с похожими функциями: оба должны отображать/добавлять/показывать/обновлять/удалять объект Java Bean, и эти два объекта Java Bean имеют много общих полей, все они имеют id/content/image_url/created_time/ user, единственная разница в том, что один bean-компонент имеет 2 поля для хранения смещений в created_time, а другой должен хранить start_time и end_time.

Итак, мой коллега решил реализовать один из них в одном классе Action struts, скопировать код и внести небольшие изменения, после чего у него появился еще один класс Action.

Я изо всех сил пытаюсь исправить его ошибку, какой шаблон проектирования или практика могут решить мою проблему?

ДОБАВЛЯТЬ:

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

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

ДОБАВИТЬ 2:

Я протестировал следующий код с помощью stuts2-json-plugin (потому что данные в формате JSON легче просматривать):

распорки.xml:

<package name="inherit" namespace="/inherit" extends="json-default">
        <action name="base" method="doStuff" class="com.carllee.exp.BaseAction">
            <result type="json">
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
        <action name="extended" method="doStuff" class="com.carllee.exp.ExtendedAction">
            <result type="json">
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
</package>

код Java

package com.carllee.exp;

import com.carllee.exp.bean.Message;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport {

    private Message message; // and getter/setter
    private String text;     // and getter/setter

    public String doStuff() {
        return SUCCESS;
    }

}

дочерний класс:

package com.carllee.exp;

public class ExtendedAction extends BaseAction {

}

если я запущу этот тест и перейду на http://localhost:8080/struts2-exp/inherit/base?message.content=hello, результатом будет:

{"message" : {"content":"hello"}}

если я перейду на http://localhost:8080/struts2-exp/inherit/extended?message.content=hello, результатом будет:

{}

и в консоли были бы предупреждения

Вот почему я говорю, что Struts 2 игнорирует сеттеры/геттеры в родительском классе.


person CarlLee    schedule 01.12.2011    source источник
comment
unfortunately, Struts 2 seem to ignore setters/getters of parent classes эм.... что?   -  person leonbloy    schedule 01.12.2011
comment
Вы не предоставляете достаточно информации, чтобы мы могли улучшить наши ответы. S2 не игнорирует родительские геттеры/сеттеры. Есть масса способов агрегировать функциональность.   -  person Dave Newton    schedule 01.12.2011
comment
... Из документов для подключаемого модуля JSON : По умолчанию свойства, определенные в базовых классах корневого объекта, не сериализуются [...]. Документация иногда полезна. Если плагин JSON не является вашим первоначальным вариантом использования, его введение может ввести вас в заблуждение.   -  person Dave Newton    schedule 01.12.2011
comment
Большое спасибо за указание на это, это так долго меня смущало /   -  person CarlLee    schedule 01.12.2011


Ответы (2)


  • Подкласс действия и добавить другие свойства?
  • Использовать одно и то же действие, но разные представления?
  • Сделать один компонент со всеми тремя полями, разными представлениями, по умолчанию, когда он не используется?
  • Использовать ModelDriven и решить, какую модель создать на основе конфигурации "method" одного действия?
  • И т.д...

Множество вариантов. Что является «лучшим», зависит от деталей, которых у нас нет.

Если вам приходится иметь дело с ПЛОХИМ кодом, с которым вам приходится иметь дело, считайте, что вам повезло — это звучит тривиально для рефакторинга. В чем собственно борьба?

person Dave Newton    schedule 01.12.2011
comment
@Dᴀᴠᴇ Nᴇᴡᴛᴏɴ Не могли бы вы объяснить, как создать экземпляр другой модели в одном классе ModelDriven? Я знаю, что модель должна быть указана до вызова метода Action. - person CarlLee; 01.12.2011
comment
@CarlLee Перед тем, как вызывается метод? Использование аннотаций? Вы можете вернуть все, что хотите, от getModel(). Пожалуйста, будьте более конкретными. - person Dave Newton; 01.12.2011
comment
@Dᴀᴠᴇ Nᴇᴡᴛᴏɴ Позвольте мне, если мой вопрос слишком прост; Я имею в виду, что я должен указать T в ModelDriven‹T›, и это до того, как мой метод Action (атрибут метода, настроенный в struts.xml) был вызван во время выполнения - person CarlLee; 01.12.2011

Я предлагаю создать абстрактный класс действий с общей частью и двумя подклассами (действия, которые будут вызываться). Абстрактный класс нельзя вызывать напрямую.

В вашем приложении подклассы могут использовать весь код родительского абстрактного класса.

person greuze    schedule 01.12.2011