Come faccio a scrivere un convertitore personalizzato nella primavera del Web flusso 2?
-
13-09-2019 - |
Domanda
Sto usando Web flusso 2.0.7 con Spring MVC e Hibernate.
Il mio problema è sui convertitori personalizzati per i miei tipi personalizzati e connessione al database da dentro il mio convertitore.
Diciamo che ho un tipo di persona e persona ha un campo di mio tipo personalizzato Titolo , e tutti i Titoli sono già nel mio database. Ora ho un form HTML, in cui un utente può compilare un persona istanza, compresa la selezione del Titolo in una casella di selezione a discesa.
Nella definizione di flusso ricevo tutti i Titoli dal database e si sono mostrati nella casella a discesa con un convertitore personalizzato, la conversione di Titolo per Stringa e poi di nuovo a Titolo .
La mia domanda riguarda il processo di conversione di ritorno da Stringa (che è l'ID del database, che ho impostato come valore sull'elemento) per il corretto Titolo oggetto dal il mio database. In sostanza:? Come fare
Finora, sono stato in grado di ottenere un titleManager iniettato nel mio convertitore per ottenere l'accesso al database. Questo scenario è stato commentato nel Primavera Forum flusso Web . Un'altra soluzione potrebbe essere quella di memorizzare nella cache Titoli prima del rendering della vista e in qualche modo ottenere l'in-memory Titolo dopo che il modulo è stato pubblicato.
Vorrei davvero apprezzare, se qualcuno potesse illuminare, come gestire questo tipo di associazione dati. Non sono riuscito a farlo funzionare così lontano e così, io ottenere l'uso minimo fuori dai webflows altrimenti impressionante.
I già postato un thread sul Web consiglio flusso , ma ancora manca un best-pratice, che non sono in grado di trovare da solo.
Grazie mille!
Wolfram
Soluzione
Io lo uso per fare questo. Fondamentalmente ho caricare l'elenco dei titoli e lo misi nel mio modello modulo. Nel modello forma Ho anche una variabile currentTitleId o selectedTitleId per memorizzare il valore della voce selezionata. Questo nome di campo si trova nel "percorso" della casella combinata primavera e l'titleList si trova nelle "voci". Quindi il valore che si desidera associare è ambientato nel "itemValue" e il testo da visualizzare per quel valore in "itemLabel". Questo è tutto.
Nel mio modello forma:
private int currentTitleId;
public long getCurrentTitleId() { return this.currentTitleId; }
public void setCurrentTitleId(long currentTitleId) { this.currentTitleId = currentTitleId; }
List titleList = getTitlesFromMyDatabaseHereOrSomewhereElse();
Nel mio jsp:
<form:label path="currentTitleId">Title</form:label>
<form:select path="currentTitleId" items="${formModel.titleList}" itemLabel="titleDescription" itemValue="titleId" />
Presumo che la classe titolo sarà qualcosa di simile a questo:
class Title {
public long getTitleId() { return this.titleId; }
public long getTitleDescription() { return this.titleDescription; }
}
È inoltre possibile personalizzare si COMBOBOX un po 'più simile a questo:
<form:select path="currentPhoneNumberId">
<form:option value="">-</form:option>
<c:forEach items="${formModel.phoneList}" var="phone">
<form:option value="${phone.phoneNumberId}">${phone.phoneNumberId} - ${phone.description}</form:option>
</c:forEach>
</form:select>
Altri suggerimenti
Io non sono così sicuro di Spring Web Flow, ma con la normale Spring MVC è sufficiente registrare un nuovo PropertyEditor e quindi questa roba funziona automaticamente
Quindi, vorrei creare un nuovo PropertyEditor che ottiene un servizio o dao che sarebbe responsabile per ottenere i dati dal database, e all'interno del PropertyEditor si dovrebbe convertire il id al vostro tipo di chiave ed ottenere il valore dal database e ritorno esso. Solo che non ho un esempio scorretto con me, ma spero che si ottiene il succo.