Perché ottengo IllegalArgumentException Can non converte il valore di tipo String al tipo di richiesta del prodotto, in primavera?

StackOverflow https://stackoverflow.com/questions/4368828

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

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top