我收到异常为什么我得到IllegalArgumentException在Spring中无法将String类型的值转换为所需类型Product?
无法属性值转换 类型的[java.lang.String中]所需 类型[beans.Product用于属性 产物;嵌套的异常是 java.lang.IllegalArgumentException异常: 无法转换 类型的值[java.lang.String中]所需类型 [beans.Product用于属性产品: 没有匹配的编辑器或转换 策略发现
甚至在我的DetailProductValidator开始通过验证方法验证之前,Errors errors对象中。
我不明白为什么春天那么做。我没有任何直接映射到产品属性/对象的输入字段。我只是在jsp中使用产品对象的属性。比如,我用:
<form:options items="${dpBackObj.product.colorMap}"/>
<!-- or -->
${dpBackObj.product.priceInDollars}
,但我从来没有使用:
<form:input path="product"/>
任何人都可以请解释为什么出现这种情况?也许告诉我一个简单的解决方案?
为控制器的bean配置为:
<!-- 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>
为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
}
如果你需要其他的一些信息,我会提供。我正在使用Spring 2.5.5。
亲切的问候,
暴君
EDIT1(由于从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(由于JacobM要求): 这是我的验证者:
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.");
}
}
}
当我到达线DetailProductBackingObject detailProductBackingObject =我已经有错误。
将请求参数转换为后台对象的属性发生在http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/BaseCommandController.html。这就是春说,关于转换:
填充使用请求参数 与属性:当接收到一个请求 ,任何BaseCommandController 将试图填补使用请求参数的命令 对象。 这是使用典型的和 着名的JavaBeans属性 表示法完成的。当存在名为'firstName'的请求参数 时, 框架将尝试呼叫 setFirstName([value])传递参数的 值。当然支持嵌套 属性。 例如,一个名为 'address.city'的参数将在 命令类中产生 getAddress()。setCity([value])调用。
重要的是要认识到,您的 不限于您的JavaBeans中的 中的字符串参数。使用 java.beans包提供的 PropertyEditor-notion,您将是 能够将字符串转换为对象 ,反之亦然。例如 的setLocale(区域设置LOC)是完全 可能命名为 区域en的值,请求参数,只要 你注册在控制器适当 属性编辑器(见 initBinder()的详细信息, 那。事项
校验:该控制器具有 成功地填充命令 对象与来自 请求参数后,它会使用任何配置 验证来验证对象验证 结果将被放入 错误对象,可以在 视图中使用,以呈现任何输入问题。
其实,我想看到的是表单提交给控制器的方法。这是Spring可能尝试将包含字符串的表单提交转换为实际Product对象的地方。 – 2010-12-06 17:53:32
嗨,JacobM,因为我自己并没有将请求参数转换为后备对象的属性(我没有专门的方法/类),所以我无法为你提供这个。这是由Spring完成的,唯一的解释是我在EDIT2中编写的那个。从这里我看不出Spring为什么要将某些字符串转换为后备对象的Product属性。有什么想法吗? – despot 2010-12-06 18:46:15