Sto creando un'applicazione Java (Spring Boot) per la creazione di entità. Ho ottenuto il mio @Controller
per ottenere i dati da un front-end Web, ho ottenuto il mio @Service
per l'elaborazione dei dati e ho ottenuto il mio @Repository
per l'archiviazione permanente delle entità. Quindi, la tua architettura di base semplice e semplice.
Ora, ho bisogno di una traccia di controllo di tutto ciò che accade nel sistema, e per questo ho creato un EventService
con metodi storeStartEvent(EntityForm form)
, storeFailEvent(EntityForm form, List errors)
e storeSavedEvent(Entity entity)
. Quindi tre eventi: "inizia a creare un'entità", "Entità creata con successo" e "errore nella creazione di un'entità". EntityForm
è solo un oggetto di trasferimento dati che viene utilizzato dal Servizio per creare un'entità effettiva.
Il mio controller si occupa di memorizzare l'evento "avviato" e l'evento "fallimento", in quanto il servizio non è necessario nel primo caso e in quest'ultimo caso il servizio genera un'eccezione che il controllore intercetta. Il Servizio salva comunque l'evento "successo" da solo se riesce a salvare l'Entità con successo.
La mia pista di controllo registra le entità, i parametri e gli indicatori di data e ora, ma mi piacerebbe comunque farlo registrare l'indirizzo IP del client. Questo non è un problema per gli eventi "avviato" e "non riuscito", poiché il Controller conosce l'indirizzo IP del client. Il problema è l'evento "salvato". Ho un metodo service.save(EntityForm form)
molto pulito che sto usando, quindi mi sto chiedendo quale sia il modo migliore di procedere.
Opzioni che ho considerato:
-
service.save(EntityForm form, InetAddress ipAddress)
sembra semplicemente sbagliato, poiché l'indirizzo IP verrebbe utilizzato solo per scopi di registrazione. -
service.save(EntityFormWithMetadata form)
con un nuovo contenitore contenente l'indirizzo IP sarebbe leggermente migliore, ma per ora sono gli unici metadati, quindi non sono troppo contento di questo neanche. -
Using a thread local variable.
Potrei memorizzare l'indirizzo IP nel controller in una variabile locale del thread e accedervi in EventService. Mi sto appoggiando a questo, ma non lo so. -
Moving the "saved" event storage into the Controller.
Potrei farlo, ma mi piacerebbe assicurarmi che se il sistema ottiene un'altra interfaccia per la creazione di Entità, l'evento "salvato" è ancora registrato. Integrando tale registrazione degli eventi nel metodosave
del servizio, è impossibile dimenticare di creare quell'evento. -
Refactoring the event creation somehow and using somehow using Java @Annotations for methods that need this kind of logging.
Questa sarebbe la soluzione più interessante, ma non so come procedere, poiché tutti gli eventi hanno diverse firme:Entity
,EntityForm
eEntityForm with List
.
Qualcuno può fornire qualche informazione?