Perché ottengo IllegalArgumentException Can non converte il valore di tipo String al tipo di richiesta del prodotto, in primavera?
-
09-10-2019 - |
Domanda
ricevo l'eccezione
Impossibile convertire il valore della proprietà di digitare [java.lang.String] a richiesta Tipo [beans.Product] per la proprietà Prodotto; l'eccezione annidata è java.lang.IllegalArgumentException: Impossibile convertire valore di tipo [Java.lang.String] per tipo richiesto [Beans.Product] per il prodotto di proprietà: nessun redattori corrispondenti o conversione strategia trovato
negli errori errori oggetto, anche prima del mio DetailProductValidator inizia validazione attraverso il metodo validate.
Non capisco il motivo per cui lo fa primavera. Non ho alcun campo di immissione mappato direttamente alla struttura del prodotto / oggetto. Mi basta usare le proprietà dell'oggetto del prodotto nel jsp. Ad esempio, io uso:
<form:options items="${dpBackObj.product.colorMap}"/>
<!-- or -->
${dpBackObj.product.priceInDollars}
, ma non ho mai utilizzare:
<form:input path="product"/>
Qualcuno può spiegare perché questo accade? E forse mi informano di una soluzione semplice?
La configurazione del fagiolo per il controllore è:
<!-- DETAIL PRODUCT FORM CONTROLLER -->
<bean id="productDetailFormController" name="/detail.htm /addToCart.htm"
class="detailProduct.DetailProductFormController">
<property name="sessionForm" value="true" />
<property name="commandName" value="dpBackObj" />
<property name="commandClass" value="detailProduct.DetailProductBackingObject" />
<property name="validator">
<bean class="detailProduct.DetailProductValidator" />
</property>
<property name="formView" value="detail" />
<property name="successView" value="redirect:/viewCart.htm" />
<property name="cartService" ref="cartServiceImpl"/>
</bean>
L'oggetto di supporto per la DetailProductFormController è:
public class DetailProductBackingObject {
private String quantityOverflowError;
private Product product;
private int quantity;
private ShoppingCart shoppingCart;
private long sizeId;
private long colorId;
public DetailProductBackingObject() {
this.product = new Product();
this.sizeId = -1;
this.colorId = -1;
}
//getters and setters
}
Se avete bisogno di qualche altra info, fornirò. Sto usando Primavera 2.5.5.
Cordiali saluti,
Despota ??p>
EDIT1 ( a causa di richiesta da parte axtavt ):
<form:form method="post" commandName="dpBackObj">
<table width="730" border="0" cellspacing="0" cellpadding="0">
<c:if test="${!empty dpBackObj.quantityOverflowError}">
<tr>
<td>
<c:out value="${dpBackObj.quantityOverflowError}"/>
</td>
</tr>
</c:if>
<spring:bind path="dpBackObj.*">
<c:if test="${not empty status.errorMessages}">
<div class="val-summary text-error" id="errorDivId">
<div style="" class="val-summary text-error" id="errorDivId">
<fmt:message key="detail.error.header"/>
<ul>
<c:forEach items="${status.errorMessages}" var="error">
<li><c:out value="${error}"/></li>
</c:forEach>
</ul>
</div>
</div>
</c:if>
</spring:bind>
<tr>
<td width="310" align="left" valign="top">
<img src="${imagesPath}/${dpBackObj.product.largeImageUrl}" alt="${dpBackObj.product.description}" />
</td>
<td width="420" align="left" valign="top">
<div id="tls_detPName">
<c:out value="${dpBackObj.product.name}"></c:out>
</div>
<div >
<strong class="numeric">${dpBackObj.product.priceInDollars}</strong>
</div>
<div id="tls_detPDescLong">
${dpBackObj.product.largeDescription}
<br />
</div>
<div >
<table cellpadding="2" border="0">
<tr>
<td align="right">
<label for="p_sizes" class="label"><fmt:message key="viewCart.Size"/></label>
</td>
<td>
<form:select path="sizeId" >
<form:option value="-1" label="x"/>
<form:options items="${dpBackObj.product.sizeMap}"/>
</form:select>
</td>
</tr>
<tr>
<td align="right">
<label for="p_colors" class="label"><fmt:message key="viewCart.Color"/></label>
</td>
<td>
<form:select path="colorId" >
<form:option value="-1" label="y"/>
<form:options items="${dpBackObj.product.colorMap}"/>
</form:select>
</td>
</tr>
</table>
</div>
<div id="tls_addToCart">
<div >
<label for="quantityId" class="label"><fmt:message key="viewCart.Quantity"/>:</label>
<form:input path="quantity" onkeypress="return checkForNumber(this, event)" maxlength="10" size="3" id="quantityId" cssClass="textbox-center"/>
<input type="image" name="addToCartButtonName" src="${imagesPath}/addToCartBtn.jpg" />
</div>
</div>
</td>
</tr>
</table>
</form:form>
EDIT2 ( a causa della richiesta di JacobM ): Questo è il mio Validator:
public class DetailProductValidator implements Validator {
public boolean supports(Class clazz) {
return DetailProductBackingObject.class.equals(clazz);
}
public void validate(Object obj, Errors errors) {
DetailProductBackingObject detailProductBackingObject = (DetailProductBackingObject) obj;
if (detailProductBackingObject.getSizeId() == -1) {
errors.rejectValue("sizeId", "error.detail.jsp.choose.size", null, "Input size.");
}
}
}
Quando raggiungo la linea DetailProductBackingObject detailProductBackingObject = Ho già l'errore.
La conversione dei parametri di richiesta per le proprietà dell'oggetto backing accade in http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/BaseCommandController.html . Questo è ciò che dice Primavera sulla conversione:
popolamento utilizzando parametri di richiesta e PropertyEditors: alla ricezione di un richiesta, qualsiasi BaseCommandController tenterà di colmare il comando oggetto utilizzando i parametri di richiesta. Questo viene fatto utilizzando il tipico e noto Proprietà JavaBeans notazione. Quando un parametro di richiesta chiamato 'firstName' esiste, il quadro tenterà di chiamare setFirstName ([value]) passando la valore del parametro. Nidificato sono naturalmente supportati. Per esempio un parametro denominato 'Address.city' si tradurrà in un getAddress (). setCity ([valore]) chiamata su la classe di comando.
E 'importante rendersi conto che si è non limitato ad argomenti stringa in i tuoi JavaBeans. Usando il PropertyEditor-nozione così come fornito dal il pacchetto java.beans, si sarà in grado di trasformare le stringhe di oggetti e viceversa. Per esempio setLocale (Locale loc) è perfettamente possibile che un parametro di richiesta locale avendo un valore di en, a patto ti sarai iscritto l'appropriato PropertyEditor nel Controller (vedi initBinder () per maggiori informazioni sulla quella materia.
I validatori: Dopo che il controller ha popolato correttamente il comando oggetto con parametri dal richiesta, userà qualsiasi configurato validatori per convalidare l'oggetto. risultati della convalida saranno messi in un Errori oggetto che può essere utilizzato in un Al fine di rendere gli eventuali problemi di ingresso.
Soluzione
Dal momento che non riesco a vedere niente di sbagliato con la forma, l'eventuale unica ragione che posso immaginare è che avete un parametro denominato product
nella URL della pagina di modulo.
Se è così, è possibile modificare i tuoi URL o l'uso DataBinder.setDisallowedFields()
per disabilitare il tentativo di legare tale parametro.