Thymeleaf #elenchi.contiene (in) utilità di espressioni non funziona

Sto lavorando con il thymeleaf standard dialetto e cercando di rendere un elenco di caselle di controllo in un form. Il rendering è ok, però, il problema è dove cerco di applicare il “bagaglio” di proprietà per le caselle di controllo utilizzando il thymeleaf #elenchi.contiene() l’espressione metodo di utilità.

Quindi ho un modello di classe che ha i seguenti campi:

private List<Template> templates;

@FormParam("selectedTemplates")
private List<String> selectedTemplates = Lists.newArrayList();

Un Thymeleaf modello frammento di html:

<div th:each="template : *{templates}">
    <input type="checkbox" name="selectedTemplates" th:value="${template.id}" 
    th:checked="${#lists.contains(product.selectedTemplates, template.id)}" />
    <label th:text="${template.filename} + ' (' + ${template.description} + ')'" />
    <!-- Attempt to use the list contains to check the field -->
    <div th:text="${product.selectedTemplates}"/>
    <div th:text="${template.id}"/>  
    <div th:text="${#lists.contains(product.selectedTemplates, template.id)}" />
</div>

Output della pagina per una delle caselle di controllo che deve essere selezionato.

<input type="checkbox" name="selectedTemplates" value="4" /> (Template Name)
<div>[4,5]</div>
<div>4</div>
<div>false<div>

Quindi, come potete vedere, mi stampa la lista che ha valori [4,5] e io uso il #elenchi.contiene il metodo per vedere se è il modello.id, tuttavia, il metodo restituisce sempre false. Ho anche provato un po ‘ di hard coded id per testare il metodo e ho sempre “false” indietro.

Per esempio:

<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, 4)}" />

Stampa [4,5]false

<div th:text="${product.selectedTemplates}"/>
<div th:text="${#lists.contains(product.selectedTemplates, '4')}" />

Stampa [4,5]false

Non so cosa sto facendo di sbagliato, ma sembra così semplice, non so che altro provare. La mia ipotesi è che c’è qualcosa di sbagliato con la sintassi. Qualsiasi suggerimento o consiglio è molto apprezzato. Io non sono in grado di trovare le risorse sulla risoluzione di questo problema, il thymeleaf guida rapidamente glosse su quella sezione.

InformationsquelleAutor Tom Lerma | 2013-12-18

4 Replies
  1. 16

    Avevo posto questa risposta in thymeleaf forum e ho avuto qualche aiuto per determinare la causa principale e la risoluzione. Vedere [http://forum.thymeleaf.org/Problem-with-thymeleaf-expression-utility-lists-contains-td4027317.html%5D%5B1%5D

    Essenzialmente, le singole stringhe di caratteri sono interpretate come un tipo di carattere di default e quindi non corrispondono a nessuna delle stringhe nell’elenco. Multi-stringhe di caratteri valutare un tipo di stringa, quindi, funziona come previsto. Incapsulando il valore cercato in html codificato citazioni, il parser è costretto a valutare la singola stringa di caratteri come un tipo di stringa invece di un tipo char. Per esempio:

    <div th:text="${#lists.contains(testList, &quot;3&quot;)}"/>
    <div th:text="${#lists.contains(testList, &quot;P&quot;)}"/>

    Volevo solo postare questo nel caso qualcuno fosse interessato alla radice la causa e la soluzione.

    InformationsquelleAutor Tom Lerma

  2. 5

    so che la domanda è vecchia, ma ho posto questa risposta così può essere utile ad altri utenti con lo stesso problema.

    non so se sei tu o un altro utente, ma qui ho trovato che bisogna aggiungere

    ” + modello.id

    così:

    th:checked="${#lists.contains(product.selectedTemplates, '' + template.id)}" 

    per me ha funzionato! Grazie

    InformationsquelleAutor SaganTheBest

  3. 2

    Ho fatto qualche ulteriore sperimentazione e trovato un problema in cui il #elenchi.contiene (in) utilità metodo non funziona per una singola stringa di caratteri. Vorrei aggiungere che sto usando thymeleaf 2.0.19, ma ha anche cercato 2.1.1.VERSIONE con lo stesso risultato.

    Ho creato una semplice lista in mio modello e aggiunto alcuni valori:

    @FormParam("testList") 
    private List<String> testList = Lists.newArrayList(); 
    
    testList.add("test1"); 
    testList.add("test2"); 
    testList.add("3"); 
    testList.add("P"); 
    testList.add("33");

    Poi testato il #elenchi.metodo contains() in questo modo:

    <div th:text="${product.testList}"/>
    <div th:text="${#lists.contains(product.testList, 'test1')}"/>
    <div th:text="${#lists.contains(product.testList, 'test2')}"/>
    <div th:text="${#lists.contains(product.testList, '3')}"/>
    <div th:text="${#lists.contains(product.testList, 'P')}"/>
    <div th:text="${#lists.contains(product.testList, '33')}"/>

    E l’output è il seguente:

    <div>[test1, test2, 3, P, 33]</div>
    <div>true</div>
    <div>true</div>
    <div>false</div>
    <div>false</div>
    <div>true</div>

    Dunque, è evidente che il metodo non funziona per le singole stringhe di caratteri. Perché sto lavorando su un nuovo progetto, ho semplicemente reimpostare le sequenze di guida di questi id, in modo che io non sono un qualsiasi singolo carattere di documento di identità per lavorare con. Che non è certamente la soluzione che speravo, ma funziona. Vorrei anche aggiungere che, al fine di ottenere il metodo di lavoro, nel contesto della mia domanda, ho dovuto aggiungere un vuoto personaggio a mio id in questo modo:

    th:checked="${#lists.contains(product.selectedTemplates, '' + template.id)}"

    Senza di essa, il metodo contains sarebbe tornato “false”, perché il modello.id è un tipo Lungo.

    Che è piuttosto strano. Per quanto posso vedere nel codice di ListUtils il metodo contains è solo chiamando contiene la lista di destinazione. Nel tuo caso, che sarebbe uguale a ${prodotto.targetList.contiene(‘3’)}. Potete controllare se questo dà il risultato corretto? In caso di 3 potevo immaginare che improvvisamente trattato come un int e poi la lista sarebbe davvero non lo contengono, ma con la ‘P’ che dovrebbe tornare proprio vero.
    O, ancora peggio, la ‘P’ è trattata come un char. Nessun indizio se questo restituisce true per un elenco di stringhe contiene
    Grazie per il feedback Martin, ho provato il codice che hai suggerito: ${prodotto.testList.contiene(‘3’)}, ${prodotto.testList.contiene(‘P’)}, ${prodotto.testList.contiene(’33’)} E il risultato fu lo stesso: “false”, “false”, “vero” quindi, forse, è che si sta cercando di dedurre un tipo di correttamente e che quindi non si lavora con un singolo carattere.

    InformationsquelleAutor Tom Lerma

  4. 0

    Come posso vedere il tuo selectedtemplates contiene un elenco di modelli e non di id, giusto?

    Se questo è il caso, si dovrebbe controllare l’elenco come questo:

    <input type="checkbox" name="selectedTemplates" th:value="${template.id}" th:checked="${#lists.contains(product.selectedTemplates, template)}" />
    Elenco<String> selectedTemplates è solo l’id non è il “modello” di entità. “Non avevo pensato che andando via. Ho trovato un lavoro intorno al quale invierò una risposta.

    InformationsquelleAutor Martin Frey

Lascia un commento