Non recupero il valore selezione da Combo

di il
9 risposte

Non recupero il valore selezione da Combo

Sto sviluppando con Spring MVC (versione 4.0) una web application.
Ho una classe prodotti con 3 campi relazionati con @manytoOne verso tabelle correlate.

descrizione classe prodotti

package com.sifhb.webapp.entities;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Range;

import com.sifhb.webapp.entities.T_Categoria;
import com.sifhb.webapp.entities.T_Tipologia;

@Entity
@Table(name="PRODOTTI")
public class Prodotti implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4758948296951581391L;
	
	private int idProdotto;
	private String descrProdotto;
	private int dispon;
	private int scomin;
	private float prezzo;
	private int qtavend;
	private String pathImange;
	private int keyUserOp;
	private Date dateOp;
	private int idStatoprodotto;
	// relazioni 
	private T_Categoria tcategoria;
	private T_Tipologia ttipologia;
	private T_Competenza tcompetenza;
	
	public Prodotti()
	{
		
	}

	@Id
	@Column(name= "IdProdotto", unique = true,nullable = false)
	@NotNull(message = "{NotNull.Prodotto.IdProdotto.validation}")
	public int getIdProdotto() {
		return idProdotto;
	}

	public void setIdProdotto(int idProdotto) {
		this.idProdotto = idProdotto;
	}

	@Column(name= "DescrizioneProdotto",nullable = true)
	@NotNull(message="Inserire la Descrizione del Prodotto")
	@Size(min=2, max=50, message = "{Size.Prodotto.descrProdotto.validation}")	
	public String getDescrProdotto() {
		return descrProdotto;
	}

	public void setDescrProdotto(String descrProdotto) {
		this.descrProdotto = descrProdotto;
	}

	
	@Column(name= "Disponibile")
	@NotNull(message="Inserire la Disponibilità del prodotto")
	@Min(value = 1,message="la Disponibilità minima 1 pezzo")
	@Max(value = 999,message="la Disponibilità massima 999 pezzi")
	public int getDispon() {
		return dispon;
	}

	public void setDispon(int dispon) {
		this.dispon = dispon;
	}

	@Column(name= "ScortaMinima")
	@Digits(integer=4, fraction=0,message="{Digits.Prodotti.Scomin.validation}")
	@NotNull(message="Inserire la Scorta Mionima del prodotto")
	@Min(value = 1,message="la scorta minima può essere  1 pezzo")
	@Max(value = 999,message="la scorta minima non può essere maggiore della disponibilità")
	public int getScomin() {
		return scomin;
	}

	public void setScomin(int scomin) {
		this.scomin = scomin;
	}

	@Column(name= "Prezzo")
	@Digits(integer=4, fraction=2,message="{Digits.Prodotti.Prezzo.validation}")
	@NotNull(message="Inserire il prezzo del prodotto")
	@Min(value = 0 ,message="il Prezzo deve essere positivo")
	@Max(value = 999,message="il prezzo non può essere maggiore di 999")
	@Range(min = 01, message = "il Prezzo non può essere negativo")
	public float getPrezzo() {
		return prezzo;
	}

	public void setPrezzo(float prezzo) {
		this.prezzo = prezzo;
	}

	@Column(name= "QtaVendute")
	@NotNull(message="Inserire la quantità del prodotto")
	@Min(value = 0 ,message="la Quantità deve essere positiva")
	@Max(value = 999,message="la Quantità non può essere maggiore di 999")
	public int getQtavend() {
		return qtavend;
	}

	public void setQtavend(int qtavend) {
		this.qtavend = qtavend;
	}

	@Column(name= "PathImage")	
	public String getPathImange() {
		return pathImange;
	}

	public void setPathImange(String pathImange) {
		this.pathImange = pathImange;
	}

	@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= "IdStatoProdotto")
	public int getIdStatoprodotto() {
		return idStatoprodotto;
	}

	public void setIdStatoprodotto(int idStatoprodotto) {
		this.idStatoprodotto = idStatoprodotto;
	}

	@ManyToOne(optional = false)
	@JoinColumn(name = "Categoria", nullable = false)
	public T_Categoria getTcategoria() {
		return tcategoria;
	}

	public void setTcategoria(T_Categoria tcategoria) {
		this.tcategoria = tcategoria;
	}

	@ManyToOne(optional = false)
	@JoinColumn(name = "Tipologia", nullable = false)
	public T_Tipologia getTtipologia() {
		return ttipologia;
	}

	public void setTtipologia(T_Tipologia ttipologia) {
		this.ttipologia = ttipologia;
	}

	
	@ManyToOne(optional = false)
	@JoinColumn(name = "Competenza", nullable = false)
	public T_Competenza getTcompetenza() {
		return tcompetenza;
	}

	public void setTcompetenza(T_Competenza tcompetenza) {
		this.tcompetenza = tcompetenza;
	}

	
}

per la gestione dei dati ho una pagina .jsp in cui opero sui campi delle tabelle correlate con un oggetto combo

il codice della pagina .jsp per la modifica dei campi è la seguente


		<div class="tab-content" id="myTabContent">
			<div class="tab-pane fade show active" id="dati1" role="tabpanel" aria-labelledby="dati-tab">
		
				<form:form  method="POST" modelAttribute="newProdotto"  action="aggiungi">
				<form:errors path="*" cssClass="alert alert-danger" element="div"/> 
				<div class="form-body">
				
					<div class="form-group">
						<label for="idProdotto"><spring:message code="insprodotto.form.idProdotto.label"/></label>
						<form:input id="idProdotto" path="idProdotto" type="text" class="form-control" placeholder="Codice Prodotto" />  
						<form:errors path="idProdotto" cssClass="text-danger"/>
					</div>
					
					<div class="form-group">
						<label for="descrProdotto"><spring:message code="insprodotto.form.descrProdotto.label"/></label>
						<form:input id="descrProdotto" path="descrProdotto" type="text" class="form-control" placeholder="Descrizione Prodotto"/> 	 
						<form:errors path="descrProdotto" cssClass="text-danger"/>
					</div>
					<div class="form-group">
						<label for="dispon"><spring:message code="insprodotto.form.dispon.label"/></label>
						<form:input id="dispon" path="dispon" type="text" class="form-control" placeholder="Disponibilita Prodotto"/> 	 
						<form:errors path="dispon" cssClass="text-danger"/>
					</div>					
					<div class="form-group">
						<label for="scomin"><spring:message code="insprodotto.form.scomin.label"/></label>
						<form:input id="scomin" path="scomin" type="text" class="form-control" placeholder="Scorta Minima"/> 	 
						<form:errors path="scomin" cssClass="text-danger"/>
					</div>			
					<div class="form-group">
						<label for="prezzo"><spring:message code="insprodotto.form.prezzo.label"/></label>
						<form:input id="prezzo" path="prezzo" type="text" class="form-control" placeholder="Prezzo"/> 	 
						<form:errors path="prezzo" cssClass="text-danger"/>
					</div>								
					<div class="form-group">
						<label for="tcategoria"><spring:message code="insprodotto.form.idCategoria.label"/></label>
						<form:select path="tcategoria" class="form-control">
							 <form:options items="${categoria}" itemValue="idCategoria" itemLabel="dCategoria" />
						</form:select>
					</div>
					<div class="form-group">
						<label for="ttipologia"><spring:message code="insprodotto.form.idTipologia.label"/></label>
						<form:select path="ttipologia" class="form-control">
							 <form:options items="${tipologia}" itemValue="idTipologia" itemLabel="dTipologia" />
						</form:select>
					</div>
					<!-- Bottone di submit -->
					<div class="form-actions">
						<input type="submit" id="btnAdd" class="btn btn-primary form-buttons" value = <spring:message code="insprodotti.form.btnAdd.label"/> />
						<a href="<spring:url value="/prodotti/" /> " id="btnAbort" class="btn btn-default form-buttons" >
							<spring:message code="insprodotti.form.btnAbort.label"/>
						</a>
					</div>
				</div>
			</form:form>
		</div>
quando effettuo il submit della form, nei campi passati del metodo GestInsProdotti del controller prodotti, i valori delle selezioni delle combo sono passati a Null.

Dove sbaglio ?

E' sicuramente un banalissimo errore.
grazie per la pazienza e attenzione.
ciao
Moreno


@RequestMapping(value = "/aggiungi", method = RequestMethod.POST)
	public String GestInsProdotti(@Valid @ModelAttribute("newProdotto") Prodotti prodotto, BindingResult result,
			Model model, RedirectAttributes redirectAttributes, HttpServletRequest request)
	{

		System.out.println("il prodotto ricevuto da form è: " + prodotto.getDescrProdotto());
			
		if (result.hasErrors())
		{
			return "insProdotto";
		}

		if (result.getSuppressedFields().length > 0)
			throw new RuntimeException("ERRORE: Tentativo di eseguire il binding dei seguenti campi NON consentiti: "
					+ StringUtils.arrayToCommaDelimitedString(result.getSuppressedFields()));
		else
		{
			prodotto.setDateOp(date);
			prodottiService.Salva(prodotto);  

		}

		return "redirect:/prodotti";
	}


Allegati:
19656_cdfbc5a86278f4bbeb9e9fab5d991fca.jpg
19656_cdfbc5a86278f4bbeb9e9fab5d991fca.jpg

19656_481e9a5a0eaec85995a26473280a9282.jpg
19656_481e9a5a0eaec85995a26473280a9282.jpg

19656_e03679051d719ea2c0783c0b337af32c.jpg
19656_e03679051d719ea2c0783c0b337af32c.jpg

9 Risposte

  • Re: Non recupero il valore selezione da Combo

    misonsan ha scritto:


    quando effettuo il submit della form, nei campi passati del metodo GestInsProdotti del controller prodotti, i valori delle selezioni delle combo sono passati a Null.
    Ah, allora sono i tcategoria/ttipologia/tcompetenza (e non gli altri, che infatti mi pareva strano) ad essere null!

    Beh, ma è ovvio! tcategoria è di tipo T_Categoria (una tua classe complessa) mentre il parametro è un String (e il messaggio di errore lo dice pure bene). Idem/simile gli altri due.

    Come si passa quindi da un String a un T_Categoria?? Spring ovviamente NON lo sa di per sé. Devi fare qualcosa tu.
  • Re: Non recupero il valore selezione da Combo

    Ciao AndBin

    hai centrato immediatamente il problema.
    Chiaro che sbaglio qualcosa, (Sicuramente nella pagina .jsp) ma non so come valorizzare correttamente i campi della combo.
    Vorrei allegarti il codice della classe T_Categoria ad esempio.
    
    
    package com.sifhb.webapp.entities;
    
    import java.io.Serializable;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    import org.hibernate.annotations.IndexColumn;
    
    import com.sifhb.webapp.entities.Prodotti;
    
    
    	
    	@Entity
    	@Table(name="T_Categoria_Prodotti")
    	public class T_Categoria implements Serializable {
    
    		/**
    		 * 
    		 */
    		private static final long serialVersionUID = 8934304798799750182L;
    		
    		
    		private int idCategoria;
    		private String dCategoria;
    		private int keyUserOp;
    		private Date dateOp;
    		private Set<Prodotti> prodotti = new HashSet<Prodotti>();
    		
    		public T_Categoria()
    		{
    			
    		}
    
    		@Id
    		@Column(name= "IdCategoria", unique = true,nullable = false)
    		@NotNull(message = "{NotNull.T_Categoria.IdCategoria.validation}")
    		public int getIdCategoria() {
    			return idCategoria;
    		}
    
    		public void setIdCategoria(int idCategoria) {
    			this.idCategoria = idCategoria;
    		}
    
    
    		@Column(name= "DCategoria")
    		@NotNull(message = "{NotNull.T_Categoria.dCategoria.validation}")
    		@Size(min=1, max=50, message = "{Size.T_Categoria.dCategoria.validation}")
    		public String getdCategoria() {
    			return dCategoria;
    		}
    
    		public void setdCategoria(String dCategoria) {
    			this.dCategoria = dCategoria;
    		}
    
    		@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="Categoria")
    		@IndexColumn(name="idcateg")
    		public Set<Prodotti> getProdotti() {
    			return prodotti;
    		}
    
    		public void setProdotti(Set<Prodotti> prodotti) {
    			this.prodotti = prodotti;
    		}	
    	
    }
    
    
    
    Mi piacerebbe capire il meccanismo dato che questi campi sono gestiti da Hibernate per le relazioni.
    Grazie

    Moreno
  • Re: Non recupero il valore selezione da Combo

    misonsan ha scritto:


    hai centrato immediatamente il problema.
    Chiaro che sbaglio qualcosa, (Sicuramente nella pagina .jsp) ma non so come valorizzare correttamente i campi della combo.
    La combo la vedi correttamente ma perché alla jsp hai passato un attributo "extra" (lista di T_Categoria) in ${categoria}.
    E al submit il parametro passato è un idCategoria (un numero int).

    Il punto è che se metti solo path="tcategoria" non ti funziona. Non ti funziona sicuramente al submit (un String non sa convertirlo in un T_Categoria). E sicuramente (verifica ma è così di certo) NON ti funziona neanche alla presentazione della pagina perché non "seleziona" nella combo il valore scelto di categoria.

    La cosa più immediata è mettere:

    path="tcategoria.idCategoria"

    Quando presenti la pagina, dovrebbe "selezionare" nella combo il valore giusto.
    E al submit, Spring istanzia un oggetto T_Categoria (inizialmente vuoto) su cui fa il binding del solo idCategoria. Se poi vuoi "tirar" su da DB un T_Categoria completo con quel idCategoria oppure no, dipende.
  • Re: Non recupero il valore selezione da Combo

    La spiegazione molto precisa e logicamente corretta.

    Ho modificato la pagina .jsp con le tue indicazioni.
    Ora la combo è così codificata
    
    
    					<div class="form-group">
    						<label for="tcategoria"><spring:message code="insprodotto.form.idCategoria.label"/></label>
    						<form:select path="tcategoria.idCategoria" class="form-control">
    							 <form:options items="${categoria}" itemValue="idCategoria" itemLabel="dCategoria" />
    						</form:select>
    					</div>
    
    

    ma il risultato è che ancora i parametri passati dalla form al metodo della classe controller contengono Null

    cosa può ancora non essere corretto ?

    grazie

    Moreno
    Allegati:
    19656_f3b3e596318d77fc4bd8229d9ec47674.jpg
    19656_f3b3e596318d77fc4bd8229d9ec47674.jpg
  • Re: Non recupero il valore selezione da Combo

    misonsan ha scritto:


    ma il risultato è che ancora i parametri passati dalla form al metodo della classe controller contengono Null
    Ma è strano ... Spring dovrebbe istanziare un oggetto T_Categoria (c'è un costruttore no-arg), assegnarlo al prodotto e poi farci il binding del idCategoria dal parametro in request.

    Almeno ora funziona la selezione nella combo quando viene visualizzata la pagina? (prima con solo path="tcategoria" non poteva di certo funzionare)
  • Re: Non recupero il valore selezione da Combo

    Ciao AndBin

    la selezione funziona, ovvero si apre la combo e vengono visualizzati tutti i campi selezionabili, ma quando faccio submit, nella request del controller i campi passati dalla form quelli di tipo textbox sono valorizzati correttamente, mentre quelli della combobox sono ancora valorizzati a null e al ritorno nella form nella quale ho fatto la selezione il valore selezionato viene perso.
    Spero di aver chiarito al meglio il comportamento della pagina e del controller.
  • Re: Non recupero il valore selezione da Combo

    misonsan ha scritto:


    la selezione funziona, ovvero si apre la combo e vengono visualizzati tutti i campi selezionabili
    Io intendevo se quando si apre la pagina la <option> pre-selezionata è quella giusta per quel prodotto. Perché se sì, vuol dire che Spring fa il match corretto del idCategoria rintracciato dal path con uno degli idCategoria degli items in ${categoria}.
    Se già questo funziona, è buona cosa.

    misonsan ha scritto:


    ma quando faccio submit, nella request del controller i campi passati dalla form quelli di tipo textbox sono valorizzati correttamente, mentre quelli della combobox sono ancora valorizzati a null e al ritorno nella form nella quale ho fatto la selezione il valore selezionato viene perso.
    Verifica il HTML generato (che le option siano corrette, ecc...) e verifica il body del POST.
  • Re: Non recupero il valore selezione da Combo

    Ciao AndBin

    sempre grazie per la disponibilità.

    mi hai chiesto
    Io intendevo se quando si apre la pagina la <option> pre-selezionata è quella giusta per quel prodotto. Perché se sì, vuol dire che Spring fa il match corretto del idCategoria rintracciato dal path con uno degli idCategoria degli items in ${categoria}.
    Se già questo funziona, è buona cosa.
    si l'elenco è generato correttamente
    Verifica il HTML generato (che le option siano corrette, ecc...) e verifica il body del POST.
    non so come fare.

    altro grosso problema è che non so come leggere lo stacktrace o fare il debug (controllando il valore delle variabili) quando l'applicazione è in debug.
    Non so come leggere e interpretare quella marea di linee di codice che viene prodotta.

    la butto li come idea.
    potrebbe essere d'aiuto farti avere il progetto ?


    Buona serata

    Moreno
  • Re: Non recupero il valore selezione da Combo

    Ciao AndBin

    Ho trovato il problema.
    nella prodotticontroller nell'elenco dei campi da interessare al binding mettevo "tcategoria" e non "tcategoria.idCategoria".
    fatta questa banalissima correzzione ora la selezione dei campi della combo rimane attiva nel caso in cui effettuata la
    submit della form vengono trovati errori.
    Infatti se trovati errori rivisualizzo la form e restano valorizzati i campi impostati al momento del submit.

    Resta comunque il peroblema di come poter riuscire a interpretare lo stacktrace.
    Grazie per l'assistenza.
    Buona serata
    Moreno
    	@InitBinder
    	public void initialiseBinder(WebDataBinder binder)
    	{
    		binder.setAllowedFields("idProdotto", "descrProdotto", "dispon", "scomin", "prezzo", "idStatoprodotto", "tcategoria.idCategoria", "ttipologia.idTipologia",
    				"tcompetenza");
    
    		binder.setDisallowedFields("prezzo");
    
    		
    		NumberStyleFormatter numberFormatter = new NumberStyleFormatter();
    		
    		numberFormatter.setPattern("###.##");
    		binder.addCustomFormatter(numberFormatter, "dispon");
    		
    		
    		numberFormatter.setPattern("##");
    		binder.addCustomFormatter(numberFormatter, "scomin");
    
    	}
Devi accedere o registrarti per scrivere nel forum
9 risposte