Я недавно работал с небольшим проектом, в котором участвуют Struts 2 и Spring 3, и мой коллега написал очень плохой код:
Мы должны реализовать два модуля с похожими функциями: оба нужно перечислить /добавить / показать / обновить / удалить объект Java Bean, и эти два объекта Java Bean имеют много общих полей, все они имеют id / content / image_url / creation_time / user, единственное отличие состоит в том, что один компонент имеет 2 поля для хранения смещений в созданном времениа другой должен хранить start_time и end_time.
Таким образом, мой коллега решил реализовать один из них в классе Action с одной стойкой, скопировать код и внес небольшие изменения, после чего у него появился другой класс Action.
Я изо всех сил пытаюсь исправить его ошибку, какой шаблон проектирования или практика могут решить мою проблему?
ADD:
Я пытался заставить эти два класса Action расширить один и тот же базовый классК сожалению, Struts 2, похоже, игнорирует методы установки / получения родительских классов, и вы не можете использовать общие типы.либо потому, что Struts 2 не будет знать, какой класс создавать и задавать установщикам в классах Action.
Я хочу уменьшить повторный код, но из-за этих 2 проблем, указанных выше, я закончилсоздание еще более повторяющегося кода и слишком сложной структуры классов, которая находится на грани разрыва.
ADD 2:
Я протестировал следующий код, используя stuts2-json-plugin (потому что это прощедля просмотра данных в формате JSON):
struts.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 игнорирует методы установки / получения в родительском классе.