Недавно я работал над небольшим проектом, который включает 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 игнорирует сеттеры/геттеры в родительском классе.
unfortunately, Struts 2 seem to ignore setters/getters of parent classes
эм.... что? - person leonbloy   schedule 01.12.2011