Validazione di Combobox

di il
14 risposte

Validazione di Combobox

Ho un'applicazione monolitica fatta con spring MVC.
Utilizzo SQL Server per database.
Ho definito una classe con dei campi relazionati verso altre tabelle e gestite con le notazioni.
Utilizzo una form che prevede l'utilizzo di alcune combobox.
inserisco alcune definizioni per parlare in maniera corretta del problema

Classe entities della tabella Anadip (anagrafica)

public class Anadip implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -4150411653547675419L;
	
	
	private int matricola;
	private String cognome;
	private String nome;
	private String noteanag;
	private String userid;
	private String password;
	private int keyUserOp;
	private Date dateOp;
	private String loggabile;
	// Relazione 
	private UserLevels userlevels;   		// verso la tabella UserLevels
	private T_StatoUtente tstatoutente;		// verso la tabella T_Stato_Utente
	private T_Titolo ttitolo;				// verso la tabella T_Titolo
	
	public Anadip() {
		
	}
	
	
	@Id
	@Column(name= "Matricola", unique = true,nullable = false)
	@NotNull(message = "{NotNull.Anadip.Matricola.validation}")
	public int getMatricola() {
		return matricola;
	}
	
	
	public void setMatricola(int matricola) {
		this.matricola = matricola;
	}

	@Column(name= "Cognome",nullable = true)
	@NotNull(message="{NotNull.Anadip.Cognome.validation}")
	@Size(min=2, max=50, message = "{Size.Anadip.Cognome.validation}")
	public String getCognome() {
		return cognome;
	}
	
	public void setCognome(String cognome) {
		this.cognome = cognome;
	}
	
	@Column(name= "Nome",nullable = true)
	@NotNull(message="{NotNull.Anadip.Nome.validation}")
	@Size(min=2, max=50, message = "{Size.Anadip.Nome.validation}")
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
	@Column(name= "NOTEDip",nullable = true)	
	public String getNoteanag() {
		return noteanag;
	}
	
	public void setNoteanag(String noteanag) {
		this.noteanag = noteanag;
	}

	@Column(name= "UserId",nullable = true)
	@NotNull(message="{NotNull.Anadip.Userid.validation}")
	@Size(min=5, max=25, message = "{Size.Anadip.Userid.validation}")
	public String getUserid() {
		return userid;
	}
	
	public void setUserid(String userid) {
		this.userid = userid;
	}

	@Column(name= "PasswordDip",nullable = true)
	@NotNull(message="{NotNull.Anadip.PasswordDip.validation}")
	@Size(min=8, max=25, message = "{Size.Anadip.PasswordDip.validation}")
	public String getPassword() {
		return password;
	}
	
	
	public void setPassword(String password) {
		this.password = password;
	}
	

	@Column(name= "KeyUtentiOperation")	
	public int getKeyUserOp() {
		return keyUserOp;
	}
	
	public void setKeyUserOp(int keyUserOp) {
		this.keyUserOp = keyUserOp;
	}

	@Column(name= "DataOperation")
	public Date getDateOp() {
		return dateOp;
	}
	
	
	public void setDateOp(Date dateOp) {
		this.dateOp = dateOp;
	}
	
	@Column(name= "loggabile")
	@NotNull(message="{NotNull.Anadip.loggabile.validation}")
	public String getLoggabile() {
		return loggabile;
	}
	
	public void setLoggabile(String loggabile) {
		this.loggabile = loggabile;
	}
	
	@ManyToOne(optional = false)
	@JoinColumn(name = "UserLevel", nullable = false)	
	public UserLevels getUserlevels() {
		return userlevels;
	}

	public void setUserlevels(UserLevels userlevels) {
		this.userlevels = userlevels;
	}

	@ManyToOne(optional = false)
	@JoinColumn(name = "IdStato", nullable = false)
	public T_StatoUtente getTstatoutente() {
		return tstatoutente;
	}


	public void setTstatoutente(T_StatoUtente tstatoutente) {
		this.tstatoutente = tstatoutente;
	}

	@ManyToOne(optional = false)
	@JoinColumn(name = "Titolo", nullable = false)	
	public T_Titolo getTtitolo() {
		return ttitolo;
	}
	public void setTtitolo(T_Titolo ttitolo) {
		this.ttitolo = ttitolo;
	}


}

Classe T_StatoUtente relazionata alla tabella Anadip sul campo IdStato

@Entity
@Table(name="T_Stato_Utente")
public class T_StatoUtente implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -1771234888100000549L;
	
	private int idStatoUtente;
	private String dStatoUtente;
	private int keyUserOp;
	private Date dateOp;
	private Set<Anadip> anadip = new HashSet<Anadip>();
	
	public T_StatoUtente()
	{
		
		
	}
	
	
	@Id
	@Column(name= "IdStatoUtente", unique = true,nullable = false)
	@NotNull(message = "{NotNull.T_StatoUtente.IdStatoUtente.validation}")
	public int getIdStatoUtente() {
		return idStatoUtente;
	}
	
	public void setIdStatoUtente(int idStatoUtente) {
		this.idStatoUtente = idStatoUtente;
	}
	
	@Column(name= "DStatoUtente")
	@NotNull(message = "{NotNull.T_StatoUtente.dStatoUtente.validation}")
	@Size(min=1, max=50, message = "{Size.T_StatoUtente.dStatoUtente.validation}")
	public String getdStatoUtente() {
		return dStatoUtente;
	}
	
	public void setdStatoUtente(String dStatoUtente) {
		this.dStatoUtente = dStatoUtente;
	}
	
	
	@Column(name= "keyUtentiOperation")
	public int getKeyUserOp() {
		return keyUserOp;
	}
	
	
	public void setKeyUserOp(int keyUserOp) {
		this.keyUserOp = keyUserOp;
	}
	
	
	@Column(name= "dataOperation")
	@Temporal(TemporalType.DATE)
	public Date getDateOp() {
		return dateOp;
	}
	
	public void setDateOp(Date dateOp) {
		this.dateOp = dateOp;
	}
	
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name="IdStato")	
	public Set<Anadip> getAnadip() {
		return anadip;
	}
	
	public void setAnadip(Set<Anadip> anadip) {
		this.anadip = anadip;
	}

nella form di gestione anagrafica, abilito la selezione dello stato tramite la combobox.
nello screenshot allegato illustro la situazione della form

codice della pagina .jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<div class="jumbotron jumbotron-billboard">
	<div class="img"></div>
	<div class="container">
		<div class="row">
			<div class="col-lg-12">
				<h2>${Titolo}</h2>
				<p>${Titolo2}</p>
			</div>
		</div>
	</div>
</div>
<section class="container">
	<div class="portlet light bordered">
		 <div class="portlet-title">
		 	 <div class="caption font-red-sunglo">
            	<i class="icon-settings oi oi-pencil"></i>
             	<span class="caption-subject bold uppercase"><spring:message code="insanadip.form.datiform.label"/></span>
            </div>
             <section class = "locale-link"> 
            	<a href="?language=en"><img width="40" height="40" src="<c:url value="/static/images/US.png" />"></a>
		      	<a href="?language=it"><img width="40" height="40"src="<c:url value="/static/images/IT.png" />"></a>                
      		</section> 
		 </div>
		<div class="portlet-body form">
				<form:form  method="POST" modelAttribute="userform"  action="aggiungi">
				<form:errors path="*" cssClass="alert alert-danger" element="div"/> 
			
				<div class="form-body">
				 
					<div class="form-group">
						<label for="matricola"><spring:message code="insanadip.form.matricola.label"/></label>
					<form:input id="matricola" path="matricola" type="text" class="form-control" placeholder="Matricola" readonly="true"/>  
						<form:errors path="matricola" cssClass="text-danger"/> 	
					</div>
					
					<div class="form-group">
						<form:label path="cognome"><spring:message code="insanadip.form.cognome.label"/></form:label>
						<form:input  path="cognome" type="text" class="form-control" placeholder="Cognome Utente"/> 	 
						<form:errors path="cognome" cssClass="text-danger"/>
					</div>
					
				<div class="form-group">
						<label for="nome"><spring:message code="insanadip.form.nome.label"/></label>
						<form:input id="nome" path="nome" type="text" class="form-control" placeholder="Nome"/> 	 
						<form:errors path="nome" cssClass="text-danger"/>
				</div>					
   
				<!-- User Name  -->				
					<div class="form-group">
						<label for="userid"><spring:message code="insanadip.form.userid.label"/></label>
						<form:input id="userid" path="userid" type="text" class="form-control" placeholder="User Id"/> 	 
						<form:errors path="userid" cssClass="text-danger"/>
					</div>		
    		<!-- Password  -->	
    				<div class="form-group">
						<label for="password"><spring:message code="insanadip.form.password.label"/></label>
						<form:password id="password" path="password" size="10" class="form-control"/>
						<form:errors path="password" cssClass="text-danger"/>
					</div>
									<!-- Radio Button per impostazione se utente loggabile -->					
					
				   <div class="form-group col-md-4">
			       	        <label for="loggabile"><spring:message code="insanadip.form.loggabile.label"/><span class="form-required">*</span></label>
				                 		  
        								SI <form:radiobutton path="loggabile" value="SI"/>  
        								NO <form:radiobutton path="loggabile" value="NO"/>  
							<form:errors path="Loggabile" cssClass="text-danger"/>
			        </div>
				<div class="form-row">
				  	<!-- Combo per selezione Titolo -->
						<div class="form-group col-md-4">
						<label for="ttitolo"><spring:message code="insanadip.form.titolo.label"/></label>
						<form:select path="ttitolo.idTitolo" class="form-control" width="70px">
			             <form:options items="${Titoli}" itemValue="idTitolo" itemLabel="dTitolo" />
						</form:select>
					</div>
					<!-- Combo per selezione Stato -->
					<div class="form-group col-md-4">
						<label for="tstatoutente"><spring:message code="insanadip.form.stato.label"/></label>
						<form:select path="tstatoutente.idStatoUtente" class="form-control">
           				<form:options items="${stato}" itemValue="idStatoUtente" itemLabel="dStatoUtente"/>
						</form:select>
					</div>
					<!-- Combo per selezione Profilo -->
					<div class="form-group col-md-4">
						<label for="userlevels"><spring:message code="insanadip.form.livello.label"/></label>
						<form:select path="userlevels.level" class="form-control">
           				<form:options items="${Profilo}" itemValue="level" itemLabel="descLevel"/>
						</form:select>
					</div>
				</div>
			  		<!-- Note  -->	
					<div class="form-group">
						<label for="noteanag"><spring:message code="insanadip.form.note.label"/></label>
						<form:textarea id="noteanag"  type="textarea" path="noteanag" cols="40" rows="6" data-component="textarea" placeholder="Inserire eventuali note" class="form-control"/> 
					</div>		
				<hr class="line-form">
				
				<div class="form-actions">
					<input type="submit" id="btnAdd" class="btn btn-primary form-buttons" value = <spring:message code="insanadip.form.btnAdd.label"/>  />
					<a href="<spring:url value="/anadip/" /> " id="btnAbort" class="btn btn-default form-buttons" >
						<spring:message code="insanadip.form.annulla.label"/>
					</a>
				</div>
			
				</form:form>
			</div>
	</div>
</section>

Problema:
su tutti i campi textbox, con le notazioni inserite sulla classe entities posso effettuare la validazione e visualizzare l'eventuale errore sul contenuto del campo.
sulla combobox vorrei evidenziare come errore la selezione relativa al valore 0 "Non selezionato"

E' possibile con le notazioni effettuare questa validazione o devo utilizzare javascript ?
Mi piacerebbe poterlo fare utiilizzando le notazioni, per avere uno standard di sviluppo.

Resto a disposizione per ulteriori chiarimenti.
Grazie

Moreno
Allegati:
19656_68ee98cdcc432a9f299d36df38bf7ca2.jpg
19656_68ee98cdcc432a9f299d36df38bf7ca2.jpg

19656_788297b6beb363d979a8b4e5632f5e32.jpg
19656_788297b6beb363d979a8b4e5632f5e32.jpg

14 Risposte

  • Re: Validazione di Combobox

    misonsan ha scritto:


    sulla combobox vorrei evidenziare come errore la selezione relativa al valore 0 "Non selezionato"
    Se il idStatoUtente deve essere >= 1 (quindi lo 0 "non selezionato" è un errore) allora banalmente:

    @Min(1) sul getIdStatoUtente() di T_StatoUtente (nota: hai messo un @NotNull ma non ha senso perché è un int)

    e poi @Valid sul getTstatoutente() di Anadip (affinché la validazione sia transitiva anche dentro l'oggetto T_StatoUtente)
  • Re: Validazione di Combobox

    Grazie andbin per la preziosa spiegazione.

    Ora viene evidenziato una situazione d'errore, ma la spiegazione è generica e non chiara per l'utente.
    Si potrebbe poter modificare il messaggio d'errore dell'utente con una dicitura personalizzabile ?

    nello screenshot spiego meglio la situazione finale che si vorrebbe.

    Grazie

    Moreno
    Allegati:
    19656_3b5b735ceba0b289c8739fa93195dea7.jpg
    19656_3b5b735ceba0b289c8739fa93195dea7.jpg
  • Re: Validazione di Combobox

    misonsan ha scritto:


    Si potrebbe poter modificare il messaggio d'errore dell'utente con una dicitura personalizzabile ?
    Lo hai già fatto con il message nelle varie annotation di validazione. Quindi quale è il dubbio?
  • Re: Validazione di Combobox

    Ciao AndBin

    scusami perla tardiva risposta, ma ho avuto un contrattempo.

    mi avevi fisposto in merito al problema con questa soluzione
    Se il idStatoUtente deve essere >= 1 (quindi lo 0 "non selezionato" è un errore) allora banalmente:

    @Min(1) sul getIdStatoUtente() di T_StatoUtente (nota: hai messo un @NotNull ma non ha senso perché è un int)

    e poi @Valid sul getTstatoutente() di Anadip (affinché la validazione sia transitiva anche dentro l'oggetto T_StatoUtente)
    impostando queste notazioni ho un problema stranissimo che riporto nello screnshot allegato e cioè

    la notazione @Valid sul getTstatoutente() di Anadip mi fa apparire il primo messaggio messaggio d'errore visibile sullo screenshot
    facendomi perdere anche il contenuto della textbox "Password".
    Non c'è nessuna relazione, ma è quanto succede.

    Se invece tolgo la notazione @Valid funziona e inserisco il record corretto.

    Comunque non risulta evidenziato in italiano il testo di notifica che la selezione per il valore 0 sulla tabella dello stato è errata.

    Sicuramente il prpoblema sono io, ma mi sembra di operare come mi hai indicato.



    grazie

    Moreno
    Allegati:
    19656_92aef322a610798a95a34bc4ce96e6c1.jpg
    19656_92aef322a610798a95a34bc4ce96e6c1.jpg
  • Re: Validazione di Combobox

    misonsan ha scritto:


    impostando queste notazioni ho un problema stranissimo che riporto nello screnshot allegato e cioè

    la notazione @Valid sul getTstatoutente() di Anadip mi fa apparire il primo messaggio messaggio d'errore visibile sullo screenshot
    facendomi perdere anche il contenuto della textbox "Password".
    Non c'è nessuna relazione, ma è quanto succede.

    Se invece tolgo la notazione @Valid funziona e inserisco il record corretto.

    Comunque non risulta evidenziato in italiano il testo di notifica che la selezione per il valore 0 sulla tabella dello stato è errata.
    Allora: innanzitutto il fatto del testo inglese "must be greater than ....." è perché non hai messo tu un testo italiano. L'ho già detto prima: hai già usato il message nelle varie annotation, quindi sai come impostare dei messaggi di errore localizzati. Quindi quale è la difficoltà nel mettere il message a quel @Min ?

    Riguardo il fatto della password, mi pare strano (/assurdo) che abbia a che fare qualcosa con il @Valid sul getTstatoutente(). Ma dovrei leggere bene il codice che hai postato.

    E comunque c'è un altro problema. In T_StatoUtente hai delle validazioni sul dStatoUtente ma questa informazione NON arriva dal form. Quindi fallisce.
    Ma questo è un problema generale, più a monte. Hai voluto tu usare le entity ANCHE per la validazione dell'input dall'UTENTE.
  • Re: Validazione di Combobox

    Ciao AndBin
    Grazie per la preziosa assistenza
    Allora: innanzitutto il fatto del testo inglese "must be greater than ....." è perché non hai messo tu un testo italiano. L'ho già detto prima: hai già usato il message nelle varie annotation, quindi sai come impostare dei messaggi di errore localizzati. Quindi quale è la difficoltà nel mettere il message a quel @Min ?
    non ho messo testo in message perchè la notazione @Min(1) mi sembra non permetta di inserire come parametri il message.
    mi sbaglio ?
    Riguardo il fatto della password, mi pare strano (/assurdo) che abbia a che fare qualcosa con il @Valid sul getTstatoutente(). Ma dovrei leggere bene il codice che hai postato.

    E comunque c'è un altro problema. In T_StatoUtente hai delle validazioni sul dStatoUtente ma questa informazione NON arriva dal form. Quindi fallisce.
    Ma questo è un problema generale, più a monte. Hai voluto tu usare le entity ANCHE per la validazione dell'input dall'UTENTE.
    Ho messo le notazioni anche sulla classe T_StatoUtente come faccio su tutte le classi entities.
    Non vedo perchè non dovrei averlo fatto.

    Relativamente al fatto della validazione campi, mi sembra corretto farlo utilizzando la validation e le notazioni sulle property.
    In alternativa in che altro modo potrei aver fatto ?

    Se la validazione delle combo da problemi, in che modo alternativo potrei aver fatto ?

    grazie

    Moreno
  • Re: Validazione di Combobox

    misonsan ha scritto:


    non ho messo testo in message perchè la notazione @Min(1) mi sembra non permetta di inserire come parametri il message.
    mi sbaglio ?
    Certo che lo permette! Tutte le annotation di validazione ce l'hanno. (consulta sempre il javadoc!)

    misonsan ha scritto:


    Ho messo le notazioni anche sulla classe T_StatoUtente come faccio su tutte le classi entities.
    Non vedo perchè non dovrei averlo fatto.
    Ragiona: la pagina che hai mostrato è per la gestione di una entità Anadip. Quindi in questo contesto il dStatoUtente di T_StatoUtente NON è un dato del form. Ma la validazione sul dStatoUtente ce l'hai comunque messa e in questo contesto ti fallirà.
    Se invece avessi da un'altra parte una pagina di gestione di una entità T_StatoUtente, allora qui HA senso avere in input il dStatoUtente e quindi la relativa validazione.

    Ti è chiaro? Come si risolve? Ci sono (almeno) due modi: uno a livello di design, ovvero NON usare direttamente le entity per la validazione ma creare delle classi bean che "modellano" meglio l'input dei dati.
    E un altro modo sfruttando una caratteristica della validation API, cioè la questione dei "gruppi". Se guardi il javadoc delle @NotNull, @Min ecc... vedi che hanno un elemento groups. Questo permette di definire dei gruppi es. A, B, C e poi quando validi un oggetto dire: bene, ora valida l'oggetto ma solo considerando le validazioni che appartengono al gruppo es. B.

    misonsan ha scritto:


    Relativamente al fatto della validazione campi, mi sembra corretto farlo utilizzando la validation e le notazioni sulle property.
    Non ho contestato l'uso delle validazioni sulle property (che è ok). Leggi bene quello che ho detto.
  • Re: Validazione di Combobox

    Ciao AndBin

    ogni tua risposta di assistenza è fonte di nuovi stimoli e per questo ti ringrazio.

    misonsan ha scritto: ?
    15 feb 2019, 11:23
    non ho messo testo in message perchè la notazione @Min(1) mi sembra non permetta di inserire come parametri il message.
    mi sbaglio ?

    Certo che lo permette! Tutte le annotation di validazione ce l'hanno. (consulta sempre il javadoc!)
    Ho cercato su internet qualceh riferimento alla notazione @Min per la validazione.
    Non trovo nulla e nessun esempio per poter impostare il messaggio d'errore nel caso sia minore del valore impostato.

    Pensavo che la forma sintattica fosse @Min(1, message = "{NotNull.Anadip.Matricola.validation}") ma non è.
    puoi dirmi come impostare il riferimento per inserire la specifica nel file message ?

    ------------------- parte sucessiva alla tua ultima speigazione

    misonsan ha scritto: ?
    15 feb 2019, 11:23
    Ho messo le notazioni anche sulla classe T_StatoUtente come faccio su tutte le classi entities.
    Non vedo perchè non dovrei averlo fatto.

    Ragiona: la pagina che hai mostrato è per la gestione di una entità Anadip. Quindi in questo contesto il dStatoUtente di T_StatoUtente NON è un dato del form. Ma la validazione sul dStatoUtente ce l'hai comunque messa e in questo contesto ti fallirà.
    Se invece avessi da un'altra parte una pagina di gestione di una entità T_StatoUtente, allora qui HA senso avere in input il dStatoUtente e quindi la relativa validazione.

    Ti è chiaro? Come si risolve? Ci sono (almeno) due modi: uno a livello di design, ovvero NON usare direttamente le entity per la validazione ma creare delle classi bean che "modellano" meglio l'input dei dati.
    E un altro modo sfruttando una caratteristica della validation API, cioè la questione dei "gruppi". Se guardi il javadoc delle @NotNull, @Min ecc... vedi che hanno un elemento groups. Questo permette di definire dei gruppi es. A, B, C e poi quando validi un oggetto dire: bene, ora valida l'oggetto ma solo considerando le validazioni che appartengono al gruppo es. B.
    non mi è assolutamente chiara la spiegazione dei due modi di eseguire la validazione.
    non capisco cosa vuol dire "creare delle classi bean che "modellano" meglio l'input dei dati.".

    nemmeno la seconda e cioè "E un altro modo sfruttando una caratteristica della validation API, cioè la questione dei "gruppi".

    hai un esempio ?
    non trovo nulla in internet.

    Mi scuserai della banalità delle risposte, che evidenziano il limite a cui mi sono attestato, ma dato ceh mi sono incaponito nel voler imparare java
    mi piacerebbe capire come risolvere il problema anceh a costo di sembrare un salame,
    Meglio fae la figura del cretino, ma voler capire come riuscire a risolvere i problemi.

    grazie

    Moreno
  • Re: Validazione di Combobox

    misonsan ha scritto:


    Ho cercato su internet qualceh riferimento alla notazione @Min per la validazione.
    Non trovo nulla e nessun esempio per poter impostare il messaggio d'errore nel caso sia minore del valore impostato.
    Ma è esattamente come hai già fatto per gli altri message (chiaramente se gli metti un message poi devi esplicitare value=1 ). Vedi sotto.

    misonsan ha scritto:


    Pensavo che la forma sintattica fosse @Min(1, message = "{NotNull.Anadip.Matricola.validation}") ma non è.
    puoi dirmi come impostare il riferimento per inserire la specifica nel file message ?
    "quasi".

    Nel senso che manca il campo value esplicito. Il @Min(1) è solo una abbreviazione perché il valore del min è nell'elemento chiamato "value". Un elemento value in una annotation è un po' speciale. Se c'è solo quello da specificare si può abbreviare.
    Se metti altro, no, lo devi esplicitare. Tutto questo è ben da sapere sulle annotation (qualunque buon libro/tutorial sulle annotation lo spiega).

    @Min(value = 1, message = "{NotNull.Anadip.Matricola.validation}")

    misonsan ha scritto:


    non capisco cosa vuol dire "creare delle classi bean che "modellano" meglio l'input dei dati.".
    Vuol dire che invece di "mappare" il form, in input dalla request, con la entity Anadip, andresti a fare un'altra classe es. AnadipForm in cui puoi modellare meglio i dati del form. Non hai bisogno es. di avere il riferimento ad altri oggetti complessi come T_StatoUtente. Puoi anche avere solo i campi semplici e "puliti" del tipo corretto per la mappatura dalla request.
    E nella AnadipForm ci metti appunto le validazioni (che toglieresti dalle entity).

    Ovviamente è poi con i dati nel AnadipForm che vai a creare le dovute entity.

    misonsan ha scritto:


    nemmeno la seconda e cioè "E un altro modo sfruttando una caratteristica della validation API, cioè la questione dei "gruppi".

    hai un esempio ?
    Non ho un esempio ora a portata di mano. Ma il concetto è semplice: puoi definire più gruppi (un gruppo è rappresentato da un Class) e assegnare uno o più gruppi a ciascuna annotazione di validazione.

    Le validazioni in Anadip:
    * tutte nel gruppo es. A
    Le validazioni in T_StatoUtente:
    * per idStatoUtente, gruppo A e gruppo B
    * per dStatoUtente, gruppo B

    Quando tu sai che stai gestendo una entità Anadip, allora nel tuo controller (usi Spring, giusto?) che riceve i dati del form puoi dire: ora mappa e valida l'oggetto Anadip SOLO con le validazioni del gruppo A. Questo chiaramente esclude il dStatoUtente. Che invece ha senso validare se stessi gestendo l'input di un T_StatoUtente.
  • Re: Validazione di Combobox

    Ciao AndBin

    mi hai indicato una soluzione
    Vuol dire che invece di "mappare" il form, in input dalla request, con la entity Anadip, andresti a fare un'altra classe es. AnadipForm in cui puoi modellare meglio i dati del form. Non hai bisogno es. di avere il riferimento ad altri oggetti complessi come T_StatoUtente. Puoi anche avere solo i campi semplici e "puliti" del tipo corretto per la mappatura dalla request.
    E nella AnadipForm ci metti appunto le validazioni (che toglieresti dalle entity).

    Ovviamente è poi con i dati nel AnadipForm che vai a creare le dovute entity.
    ho seguito il tuo consiglio e ho creato la classe entities "AnadipForm" senza le relazioni alle tabelle correlate.
    fatto ovviamente le classi AnadipFormDao ( con classe Impl) e AnadipFormService (con classe Impl)
    Aggiornato i metodi nella AnadipController

    e ..... tutto funziona magicamente.

    relativamente alla seconda modalità e precisamente

    misonsan ha scritto: ?
    15 feb 2019, 15:10
    nemmeno la seconda e cioè "E un altro modo sfruttando una caratteristica della validation API, cioè la questione dei "gruppi".

    hai un esempio ?

    Non ho un esempio ora a portata di mano. Ma il concetto è semplice: puoi definire più gruppi (un gruppo è rappresentato da un Class) e assegnare uno o più gruppi a ciascuna annotazione di validazione.

    Le validazioni in Anadip:
    * tutte nel gruppo es. A
    Le validazioni in T_StatoUtente:
    * per idStatoUtente, gruppo A e gruppo B
    * per dStatoUtente, gruppo B

    Quando tu sai che stai gestendo una entità Anadip, allora nel tuo controller (usi Spring, giusto?) che riceve i dati del form puoi dire: ora mappa e valida l'oggetto Anadip SOLO con le validazioni del gruppo A. Questo chiaramente esclude il dStatoUtente. Che invece ha senso validare se stessi gestendo l'input di un T_StatoUtente.
    Non ho capito molto come gestire.
    Sarebbe importante un progetto d'esempio.
    Riesci a tgrovare qualcosa ?

    Grazie

    Moreno
  • Re: Validazione di Combobox

    misonsan ha scritto:


    ho seguito il tuo consiglio e ho creato la classe entities "AnadipForm" senza le relazioni alle tabelle correlate.
    fatto ovviamente le classi AnadipFormDao ( con classe Impl) e AnadipFormService (con classe Impl)
    Aggiornato i metodi nella AnadipController
    No no, alt. Allora: la classe che ho detto la puoi chiamare come vuoi: AnadipForm, AnadipView, AnadipVO (VO = View Object) ecc.. E' solo questione di scegliere uno stile di denominazione e mantenerlo coerente nella applicazione. Questa classe NON è una "entity" (nel senso di JPA, del @Entity) ma una normale classe con le proprietà che "modellano" il form di input (e con le opportune annotation di validazione). L'importante è che sia chiaro che questa classe è legata alla interfaccia utente e non alla base dati più "sotto".

    Il controller certamente deve "sapere" di questa classe, visto che riceve un oggetto di questa classe su cui sono mappati i parametri in input dalla request. Anche lo strato di Service può sapere di questa classe, cioè alla fin fine il controller può benissimo passare l'oggetto AnadipForm ad un Service.
    Ma lo strato dei Dao no! I Dao non devono "sapere" nulla di questi oggetti legati alla interfaccia utente. Se hai usato JPA hai appunto le classi di entity (@Entity) e i Dao devono operare solo con queste entity.
    E' il Service che deve "mettere insieme" i pezzi, ovvero a fronte di un oggetto AnadipForm ad esempio da salvare, deve usare il/i Dao necessari per salvare tutti i dati come/quanto necessario.

    misonsan ha scritto:


    Non ho capito molto come gestire.
    Sarebbe importante un progetto d'esempio.
    Riesci a tgrovare qualcosa ?
    Non ho un esempio già fatto (e non ho purtroppo molto tempo per scriverne uno io). Ti assicuro che è più semplice di quello che credi ma capisco la difficoltà.
    Appena riesco faccio una ricerca per vedere se trovo info/esempi che riusciresti a comprendere.
  • Re: Validazione di Combobox

    Ciao AndBin

    grazie per essere presente anche di Sabato.
    La tua risposta, relativamente alla classe AnadipForm mi ha del tutto spiazzato.
    Credo di aver commesso un errore di fondo molto grosso.
    Ho creato per gestire il problema una classe di Tipo Entity chiamata "AnadipForm" e quindi con la conseguenza di creare
    anche la classe service (con Impl) e Dao (Con Impl).

    mi scrivi
    Questa classe NON è una "entity" (nel senso di JPA, del @Entity) ma una normale classe con le proprietà che "modellano" il form di input (e con le opportune annotation di validazione). L'importante è che sia chiaro che questa classe è legata alla interfaccia utente e non alla base dati più "sotto".
    Domande:
    1) se non è una entity in che package la devo mettere ?

    ero abituato a mettere le annotation di validazione sulla classe entity

    2) dalla classe Entity Anadip "Devo" togliere le annotazioni di validazione ?

    se si, dovendo fare altre form sulla classe Anadip, sono costretto a fare sempre delle classi Anadipform1, AnadipForm2, ecc ?

    mi casca un pò l'impalcatura.
    devo fare un pò di chiarezza.

    se non ho capito male, nel controller devo fare riferimento come classi .service e .dao a "Anadip.Service" e "Anadip.Dao".

    quindi ho creato in maniera errata le classi AnadipFormService (+ Impl) e AnadipFormDao (+impl).

    la classe AnadipForm viene utilizzata nella form per passare i dati.


    dimmi se fino a qui ho fatto correttamente.
    Su questo filone hai qualche esempio ?

    Grazie

    moreno

    Grazie

    Moreno
  • Re: Validazione di Combobox

    Ciao AndBin

    Ho seguito il tuo consiglio.
    Creato la classe AnadipForm senza @Entity in un package apposito.
    cancellate le interfacce AnadipFormService e la class Impl, la AnadipFormDao e Impl.
    i dati li recupero da AnadipService e AnadipDao.

    Funziona benissino.

    Grazie

    Mi resta da chiarire invece quanto mi avevi indicato con la validazione a mezzo gruppi.
    Non ho un esempio ora a portata di mano. Ma il concetto è semplice: puoi definire più gruppi (un gruppo è rappresentato da un Class) e assegnare uno o più gruppi a ciascuna annotazione di validazione.

    Le validazioni in Anadip:
    * tutte nel gruppo es. A
    Le validazioni in T_StatoUtente:
    * per idStatoUtente, gruppo A e gruppo B
    * per dStatoUtente, gruppo B
    se hai qualche esempio sarebbe veramente importante per chiarire questa modalità.
    Grazie e buona domenica.

    ciao

    Moreno
  • Re: Validazione di Combobox

    misonsan ha scritto:


    se hai qualche esempio sarebbe veramente importante per chiarire questa modalità.
    Non ho esempio da indicare o fatti da me. Ma ripeto, è più semplice di quanto credi.
    Vedi ad esempio la (ma vale anche per le altre), ha un elemento chiamato groups di tipo Class<?>[] (un array di oggetti Class).

    Puoi usare un qualunque Class per definire un gruppo. Alla validation API non interessa quale/dove sia né cosa contenga. E' solo un tipo che "marca" un gruppo. Puoi anche farti delle piccole interface vuote apposite es.:

    public interface BookEditGroup {}
    public interface AuthorEditGroup {}

    Poi in una classe puoi avere un membro con il @NotNull così:

    @NotNull(groups = { BookEditGroup.class, AuthorEditGroup.class })

    (idem per @Min, @Size, ecc..)


    Nei controller Spring solitamente si fa una cosa del tipo es.:

    @PostMapping("/book/edit")
    public String bookEdit(@Valid @ModelAttribute("book") Book book, BindingResult bindingResult) { ...... }

    Il punto è che @Valid è della Validation API ma è solo una marker annotation, non ha elementi. E quindi non può indicare qualcosa di più specifico.

    Spring Framework ha introdotto una estensione per la validazione, definendo una @Validated che ha l'elemento value proprio del tipo Class<?>[] per indicare uno o più gruppi. Quindi puoi cambiare il metodo in es.:

    @PostMapping("/book/edit")
    public String bookEdit(@Validated(BookEditGroup.class) @ModelAttribute("book") Book book, BindingResult bindingResult) { ...... }

    E quindi dici a Spring: valida l'oggetto Book appena popolato con i dati dalla request ma SOLO considerando le annotation di validazione che hanno gruppo BookEditGroup.

    Stop, fine, è tutto lì. Dovrei per sicurezza andare a rileggere la documentazione ma credo non sia necessario altro.
Devi accedere o registrarti per scrivere nel forum
14 risposte