Sto lottando un po 'con il lancio di classe. Lasciatemi ambientare la scena. Ho un codice Java server che usa un livello di servizio e orchestratore. Una richiesta arriva nel livello di servizio in un formato di bean (classe java allineata con la vista front-end), e poi ho un gruppo di classi domainBeanMapper che prendono un oggetto in formato bean e lo traducono in un oggetto formato dominio. Ad esempio, UserBean ha una dataObBirth rappresentata da una stringa, mentre User ha la dataOfBirth rappresentata da una Data, quindi UserMapper.java renderà la stringa della data in un oggetto data. Quindi per ogni oggetto nel sistema ho un * .java, * Bean.java e * Mapper.java (User.java, UserBean.java, userMapper.java).Java: eseguire il cast su un'interfaccia, quindi scoprire che tipo di fuso è
in applicationContext tengo il rapporto da ogni oggetto al loro mapper, come questo:
<util:map id="domainBeanMappers">
<entry key="UserBean" value-ref="userMapper" />
<entry key="User" value-ref="userMapper" />
.....
e poi ho definire il mapper:
<bean id="userMapper" class="com.me.mapping.UserMapper" parent="baseDomainBeanMapper"/>
io chiamo il mapper di fagioli dominio come questo da il mio livello di servizio:
UserBean userBean = (UserBean) getDomainBeanMapper().mapDomainToBean(user);
Nella corsa di questo codice trovo il mapper obje ct che voglio in questo modo:
DomainBeanMapper mapper = findApplicableMapper(myObject.getClass().getName());
if (mapper == null) {
mapper = findApplicableMapper(myObject.getClass().getSimpleName());
}
dove findApplicableMapper funziona così:
private DomainBeanMapper findApplicableMapper(String string) {
return domainBeanMappers.get(string);
}
Negli ultimi anni, questo ha funzionato come un fascino. Per qualunque oggetto io desideri nel sistema posso facilmente selezionare il relativo mapper e quindi tradurre dal mio formato bean in formato dominio e viceversa, in base alla chiamata .getClass() di qualsiasi istanza.
Ora ho un nuovo requisito che mi dà problemi. Voglio essere in grado di tradurre dal mio oggetto Utente a diversi sottooggetti in base a un parametro. Quindi per alcune chiamate, voglio solo l'id, firstName e lastName back. Per le altre chiamate voglio più campi, ma ancora non l'intero oggetto, e poi per alcune chiamate voglio che l'intero oggetto venga restituito come prima. Non voglio scendere il percorso degli oggetti secondari e finire con UserLight, UserLightWithName, UserLightWithNameButNoAddress, ... argh nightmare.
Così invece speravo di creare un gruppo di interfacce che rappresentassero "viste". Quindi la richiesta arriva con il ViewType di Basic, e ciò significa che voglio i dettagli e l'indirizzo personale dell'utente. Così ho scritto un'interfaccia chiamata UserBasic, ha ottenuto l'utente per la sua attuazione, e ha aggiunto una mappatura da UserBasic a UserBasicMapper, e da UserBasicBean a UserBasicMapper, nella speranza che avrei potuto fare la chiamata di tradurre in questo modo:
UserBasicBean restrictedUserReturn = (UserBasicBean) getDomainBeanMapper().mapDomainToBean((UserBasic)user);
ma questo non funziona perché getClass() restituisce sempre la classe delle istanze, non l'interfaccia su cui è stato eseguito il cast. Immagino di poter sempre aggiungere un altro parametro alla chiamata mapDomainToBean, che è la classe che voglio usare, ma il codebase è abbastanza massiccio e dovrò toccare ogni chiamata se apporto questa modifica.
Quindi in sostanza sto cercando un modo per trasmettere un'istanza a un tipo di interfaccia e quindi trovare quel tipo di interfaccia? È possibile??
croci dita ...
Perché non vuoi l'intero oggetto? –
è un requisito di sicurezza. alcuni utenti del sistema possono vedere solo determinate parti di oggetti. – Margaret