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: