Una reconsideración de su arquitectura es potencialmente práctica en este escenario. Si puede aislar los datos que se deben serializar en un objeto de transferencia de datos (DTO) simple, entonces debería ser posible proporcionar un contenedor a esa DTO que a su vez puede contener dependencias a otros beans.
Por ejemplo:
public interface IDataBean {
void setSomething(String someData);
}
// This is your session bean - just a plain DTO
public class MyDataBean implements IDataBean, Serializable {
private String someData;
public void setSomething(String someData) {
this.someData = someData;
}
}
// This is the wrapper that delegates calls to a wrapped MyDataBean.
public class MyDataBeanWithDependency() implements IDataBean {
private SomeOtherService service;
private MyDataBean dataBean;
public SimpleDataBeanWithDependency(MyDataBean dataBean, SomeOtherService service) {
this.dataBean = dataBean;
this.service = service;
}
public void setSomething(String someData) {
// Here we make a call to the service to perform some specific logic that may, for example, hit a DB or something.
String transformedString = service.transformString(someData);
dataBean.setSomething(transformedString);
}
}
public class SomeService {
// This is a Spring session scoped bean (configured using <aop:scoped-proxy/>)
@Autowired
private MyDataBean myDataBean;
// Just a plain singleton Spring bean
@Autowired
private SomeOtherService someOtherService;
public IDataBean getDataBean() {
return new MyDataBeanWithDependency(myDataBean, someOtherService);
}
}
Lo siento por todo el código! Sin embargo, déjame tratar de explicar lo que quiero decir aquí. Si siempre recupera el bean de sesión a través de un servicio (en este caso, SomeService), tiene la opción de crear un contenedor alrededor del bean de sesión. Este contenedor puede contener cualquier dependencia de bean (autoenlazada en SomeService) que desee utilizar como parte de la ejecución de la lógica junto con el bean de sesión.
Lo bueno de este enfoque es que también se puede programar en una interfaz (ver IDataBean). Esto significa que, si usted, por ejemplo, tenía un controlador que obtiene el bean de datos del servicio, hace que las pruebas/burlas unitarias sean muy limpias.
Posiblemente, un enfoque incluso más limpio desde la perspectiva del código, sería que MyDataBeanWithDependency se registrara en el contenedor de resorte utilizando el alcance de "solicitud". Así que podrías conectar ese bean directamente a SomeService. Esto esencialmente trataría de forma transparente con la creación de instancias, por lo que no es necesario crear una instancia de MyDataBeanWithDependency manualmente desde el servicio.
¡Espero haber hecho lo suficiente para explicarme aquí!
La serialización y la deserialización se realiza mediante el contenedor web (la instancia de SomeBean está en algún lugar de la sesión HTTP) por lo que no puedo delegar la deserialización en una fábrica. – kayahr