GWT RequestFactory: ¿Cómo puedo obtener una ID persistente de stableId()?
(3)
La clase que implementa un EntityProxyId
es SimpleEntityProxyId
. Esta clase tiene un método getServerId()
, que devolverá el id. Entonces, al verificar con instanceof
, puede llamar al método. (En realidad, RequestFactory.getHistoryToken()
ni siquiera lo comprueba, sino que simplemente lo envía a esta clase).
Ahora las malas noticias: están codificadas y la clase base para SimpleEntityProxyId
, que es SimpleProxyId
y contiene el método getServerId()
, indica específicamente:
CodifiedAddress es totalmente opaco para el cliente. Probablemente sea una cadena codificada en base64, pero podría tener dígitos de pi. Cualquier código que haga algo diferente a enviar el contenido de este campo al servidor es incorrecto.
(Donde el campo encodedAddress
contiene el ID del servidor)
Uso ID Long
en mis entidades, no solo para almacenarlos en el almacén de datos, sino para hacer referencia a otras entidades. Ahora, estoy usando RequestFactory para crear () objetos en el cliente y persistirlos, pero necesito una forma de averiguar qué id ha generado el servidor.
Aquí hay una manera que he descubierto que requiere dos viajes:
final OrganizationProxy proxy = context.create(OrganizationProxy.class);
context.persist().using(proxy).fire(new Receiver<Void>(){
public void onSuccess(Void response)
{
requestFactory.find(proxy.stableId()).fire(new Receiver<OrganizationProxy>()
{
public void onSuccess(OrganizationProxy response)
{
//hey, now response has the server-generated id in it, along with any other values the server populated
}
});
}
});
Pero parece que debe haber una forma de obtener la identificación persistente sin el segundo viaje. Parece que requestFactory.find () necesitaría en primer lugar la identificación persistente para funcionar.
¿Cómo puedo obtener la identificación persistente sin una segunda solicitud al servidor?
======= Actualización =======
Finalmente se me ocurrió (después de que tbroyer me dijera ;)) que podía devolver la identificación Long
del método persist () en RequestContext. Esto no recupera el ID persistente de EntityProxyId
, pero sí me proporciona el ID persistente de un nuevo objeto en una única solicitud.
Dejaré abierta esta pregunta: sigo interesado en obtener el ID persistente de un EntityProxyId.
Puede obtener una representación de cadena de un EntityProxyId llamando a RequestFactory.getHistoryToken()
. Esto se puede convertir nuevamente a un EntityProxyId
llamando a RequestFactory.getProxyId()
.
En el lenguaje de RequestFactory, la identificación de una entidad recién creada es "efímera". Una identificación efímera solo es válida en la instancia de RequestFactory
que creó el RequestContext
utilizado para crear EntityProxy
. Cuando se RequestContext
el RequestContext
y todas las invocaciones de métodos han sido procesadas por el servidor, SimpleRequestProcessor
verificará los objetos efímeros de la carga útil y, si se han conservado, la carga útil resultante actualizará el estado del cliente con el valor devuelto por el método getId()
.
La identidad del objeto y la igualdad de un EntityProxyId
no cambiará cuando cambie del estado efímero a persistente, pero su token de historial asociado cambiará:
OrganizationProxy proxy = context.create(OrganizationProxy.class);
final EntityProxyId<?> id = proxy.stable();
String ephemeralString = factory.getHistoryToken(id);
context.persist().using(proxy).fire(new Receiver<Void>() {
public void onSuccess(Void response) {
String persistedString = factory.getHistoryToken(id);
assert !ephemeralString.equals(persistedString);
assert factory.getProxyId(ephemeral) == factory.getProxyId(persistedString);
MyRequestFactory otherFactory = GWT.create(MyRequestFactory.class);
assert factory.getProxyId(ephemeral) != otherFactory.getProxyId(ephemeral);
// Throws IllegalArgumentException
otherFactory.find(otherFactory.getProxyId(ephemeral));
}
});
En la demostración anterior, una vez que haya persistedString
, puede esconder el valor en una cookie u otro mecanismo de persistencia del lado del cliente y volver a crear la identificación más tarde para usarla con una llamada a RequestFactory.find()
. La segunda y tercera afirmaciones demuestran el "alcance" de una identificación efímera. Las formas efímeras y persistentes se pueden usar de forma intercambiable con RequestFactory
que creó el objeto. Si se utiliza una identificación efímera con una instancia recién creada de RequestFactory
(lo que sucedería si una identificación efímera se marcara como un token de History
), obtendrá un EntityProxyId
, pero no se puede usar con ningún propósito útil. .
Acabo de declarar el método getId () en mi interfaz Proxy y parece funcionar. ¿Hay algún problema con este enfoque?