Warum erhalte ich Illegal kann nicht Wert vom Typ String benötigt Typ Produkt umwandeln, im Frühjahr?

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

Frage

Ich erhalte die Ausnahme

Fehler beim convert Eigenschaftswert Geben Sie [java.lang.String], um erforderlich Typ [beans.Product] für Immobilien Produkt; verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Kann nicht Wert vom Typ umwandeln [Java.lang.String] auf die gewünschte Art [Beans.Product] für Immobilien Produkt: keine passende Editoren oder Konvertierung Strategie gefunden

in den Fehlern Fehler Objekt, noch bevor mein DetailProductValidator beginnt durch die Validate-Methode zu validieren.

Ich verstehe nicht, warum Frühling das tut. Ich habe kein Eingabefeld, das direkt auf die Produkteigenschaft / Objekt abgebildet wird. Ich benutze nur die Eigenschaften des Produkts Objekt in der jsp. Zum Beispiel verwende ich:

<form:options items="${dpBackObj.product.colorMap}"/>
<!-- or -->
${dpBackObj.product.priceInDollars}

aber ich habe nie verwenden:

<form:input path="product"/>

Kann jemand bitte erklären, warum dies geschieht? Und vielleicht informieren Sie mich über eine einfache Lösung?

Die Bohne Konfiguration für den Controller ist:

    <!-- 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>

Das Trägerobjekt für den DetailProductFormController ist:

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
}

Wenn Sie einige andere Informationen benötigen, werde ich sorgen. Ich bin mit Frühling 2.5.5.

Mit freundlichen Grüßen, Despot

EDIT1 ( aufgrund Anfrage von 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 ( aufgrund JacobM Wunsch ): Das ist mein 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.");
        }
    }
}

Wenn ich die Linie erreichen DetailProductBackingObject detailProductBackingObject = Ich habe bereits den Fehler.
Die Umwandlung der Anforderungsparameter auf die Unterlage von Objekteigenschaften geschieht in http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/BaseCommandController.html . Dies ist, was Frühling sagt über die Umwandlung:

Bestücken mit Anforderungsparameter und PropertyEditors: Beim Empfang eines Anfrage alle BaseCommandController wird versuchen, den Befehl zu füllen Objekt der Anforderungsparameter. Dies geschieht mit Hilfe der typischen und bekannte JavaBean Eigenschaft Notation. Wenn ein Anforderungsparameter Namen ‚vorName‘ existiert, die Rahmen wird versuchen, zu nennen setFirstName ([Wert]) Leiten der Wert des Parameters. verschachtelte Eigenschaften werden natürlich unterstützt. Zum Beispiel genannt ein Parameter ‚Address.city‘ wird in einer Folge getAddress (). setCity ([Wert]) Anruf auf die Befehlsklasse.

Es ist wichtig zu erkennen, dass Sie nicht zu String Argumente beschränkt in Ihr Java Beans. Verwendung der Property-Begriff wie geliefert von das java.beans Paket, werden Sie Lage Strings Objekte zu verwandeln und umgekehrt. Zum Beispiel setLocale (Locale loc) ist perfekt möglich, dass eine Anfrage Parameter mit dem Namen locale mit einem Wert von en, so lange wie Sie das entsprechende Register Property im Controller (siehe initBinder () für weitere Informationen über dass die Materie.

Validatoren: Nachdem der Regler erfolgreich den Befehl gefüllt Objekt mit Parametern aus dem Verlangen wird es verwenden, jede konfiguriert Validierer das Objekt zu validieren. Validierungsergebnisse werden in einem gesetzt werden Fehler Objekt, das in a verwendet werden kann Ansicht machen alle Eingänge Probleme.

War es hilfreich?

Lösung

Da ich nichts falsch mit der Form sehen kann, ist der einzig mögliche Grund kann ich mich vorstellen, dass Sie einen Parameter mit dem Namen product in der URL Ihrer Formularseite haben.

Wenn ja, können Sie Ihre URLs oder Verwendung DataBinder.setDisallowedFields() ändern, den Versuch zu deaktivieren, die Parameter zu binden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top