Mantener mi código seco en la acción de Struts 2
-
27-10-2019 - |
Pregunta
Recientemente he estado trabajando con un pequeño proyecto que involucra Struts 2 y Spring 3 y mi colega había escrito un código muy malo:
Tenemos que implementar dos módulos de funcionalidades similares: ambos necesitan enumerar/agregar/mostrar/actualizar/eliminar el objeto Java Bean, y esos dos objeto Java Bean tienen muchos campos en común, todos tienen ID/Content/Image_URL/Create_Time/ Usuario, la única diferencia es que One Bean tiene 2 campos para almacenar compensaciones en Create_Time y el otro tiene que almacenar Start_Time y End_Time.
Entonces, mi colega decidió implementar uno de ellos en una clase de acción de Struts y copiar el código e hizo algunos pequeños cambios, luego tuvo otra clase de acción.
Estoy luchando por corregir su error, ¿qué patrón de diseño o práctica puede resolver mi problema?
AGREGAR:
He tratado de hacer que esas dos clases de acción extiendan la misma clase base, desafortunadamente, los Struts 2 parecen ignorar a los setters/getters de las clases de los padres, y no puede usar tipos genéricos porque nuevamente, Struts 2 no sabrá a qué clase instanciar y dar a los setters en las clases de acción.
Quiero reducir el código repetido, pero debido a esos 2 problemas mencionados anteriormente, terminé haciendo un código más repetido y una estructura de clase demasiado complicada que está al borde de ser roto.
Agregar 2:
Probé el siguiente código usando Stuts2-Json-Plugin (porque es más fácil observar los datos en formato 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>
el código 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;
}
}
Clase infantil:
package com.carllee.exp;
public class ExtendedAction extends BaseAction {
}
Si ejecuto esta prueba y voy a http: // localhost: 8080/struts2-exp/herhherit/base? Message.content = Hola, el resultado sería:
{"message" : {"content":"hello"}}
si voy a http: // localhost: 8080/struts2-exp/herhherit/extended? Message.content = Hola, el resultado sería:
{}
y habría advertencias en la consola
Es por eso que digo que Struts 2 ignora a los setters/getters en la clase matriz.
Solución
- ¿Subclase la acción y agregue las otras propiedades?
- ¿Usa la misma acción pero diferentes vistas?
- ¿Hacer un frijol con los tres campos, diferentes vistas, predeterminados cuando no se usa?
- Usar
ModelDriven
y decida qué modelo instanciar basado en una sola acción"method"
¿configuración? - Etc...
Muchas opciones. Lo cual es "mejor" depende de los detalles que no tenemos.
Si ese es la extensión del código incorrecto con el que tiene que lidiar, considérate afortunado: esto suena trivial para refactorizar. ¿Cuál es la lucha real?
Otros consejos
Sugiero crear una clase de acción abstracta con la parte común y dos subclases (acciones que se llamarán). La clase abstracta no se puede llamar directamente.
En su aplicación, las subclases pueden usar todo el código en la clase de resumen matriz.