Pourquoi puis-je obtenir IllegalArgumentException Ne peut pas convertir une valeur de type Chaîne de caractères requis, le type de Produit, au Printemps?

Je reçois l'exception

A échoué à convertir la valeur de la propriété
type [java.lang.String] requis
type [haricots.Produit] pour les biens
produit; nested exception est
java.lang.IllegalArgumentException:
Ne peut pas convertir une valeur de type
[java.lang.String] de type
[haricots.Produit] pour la propriété du produit:
l'absence de correspondance des éditeurs ou de conversion
stratégie trouvé

dans le cas d'erreurs les Erreurs de l'objet avant même mon DetailProductValidator commence la validation par le biais de la validation de la méthode.

Je ne comprends pas pourquoi le Printemps ne fait que. Je n'ai pas de champ de saisie qui est mappé directement sur le produit des biens ou de l'objet. Je viens d'utiliser le produit des propriétés de l'objet dans la page jsp. Par exemple, j'utilise:

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

mais je ne l'utilise jamais:

<form:input path="product"/>

Quelqu'un peut-il expliquer pourquoi cela se produit? Et peut-être m'indiquer une solution simple?

La fève de configuration du contrôleur est:

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

La sauvegarde de l'objet pour la DetailProductFormController est:

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
}

Si vous avez besoin d'autres infos, je vais vous donner. Je suis à l'aide de Printemps 2.5.5.

Salutations,

Despote

EDIT1 (en raison de la demande de 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 (en raison de JacobM demande):
C'est mon programme de validation:

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.");
}
}
}

Quand j'arrive à la ligne DetailProductBackingObject detailProductBackingObject = j'ai déjà l'erreur.

La conversion des paramètres de la requête à la sauvegarde des propriétés de l'objet qui se passe dans http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/BaseCommandController.html . C'est ce qui Ressort dit à propos de la conversion:

Remplissage à l'aide de paramètres de la requête
et PropertyEditors: Lors de la réception d'un
demande, tout BaseCommandController
va tenter de remplir la commande
objet à l'aide des paramètres de la requête.
Ceci est fait en utilisant le typique et
bien connu propriété JavaBeans
la notation. Lorsqu'un paramètre de la requête
nommé "prenom" existe, le
cadre essaiera d'appeler
setFirstName([valeur]) en passant à la
la valeur du paramètre. Imbriquée
les propriétés sont bien sûr pris en charge.
Par exemple, un paramètre nommé
'adresse.de la ville " se traduira dans un
getAddress().setCity([valeur]) appeler
la classe de commande.

Il est important de réaliser que vous êtes
pas limité aux arguments de la Chaîne en
votre JavaBeans. À l'aide de la
PropertyEditor-notion telle que fournie par
la java.haricots package, vous serez
capable de transformer les Chaînes d'Objets
et dans l'autre sens. Par exemple
setLocale(Locale loc) est parfaitement
possible pour un paramètre de la requête nommée
paramètres régionaux ayant une valeur de fr, aussi longtemps
que vous vous inscrivez sur le approprié
PropertyEditor dans le Contrôleur (voir
initBinder() pour plus d'informations sur
que la matière.

Validateurs: Après que le contrôleur a
avec succès rempli la commande
objet avec les paramètres de la
demande, il utilisera tout configuré
les validateurs pour valider l'objet.
Les résultats de la Validation sera mis dans une
Les erreurs objet qui peut être utilisé dans un
Vue de rendre toute entrée problèmes.

En fait, ce que j'aimerais voir, c'est la méthode de contrôleur que le formulaire est soumis. C'est l'endroit où le Printemps est probablement pour essayer de tourner la soumission d'un formulaire composé de chaînes en un Produit réel de l'objet.
Salut JacobM, puisque je n'ai pas de convertir les paramètres de la requête à la sauvegarde de l'objet proprietèes moi-même (je n'ai pas de méthode spécifique/classe pour ça), je ne peux pas offrir cela pour vous. Ceci est fait par le Printemps et la seule explication que nous avons est celui que j'ai écrit en EDIT2. À partir de cela, je ne vois pas pourquoi le Printemps voulez convertir une Chaîne de caractères à la propriété des Produits de la sauvegarde de l'objet. Toutes les pensées?
Essayez de prendre la demande en tant qu'il est soumis (Firebug est un bon moyen) et de regarder tous les paramètres. Est-il un paramètre appelé "produit"?

OriginalL'auteur despot | 2010-12-06