为什么在春季,我要获得IllegalargumentException无法将类型字符串的值转换为所需类型的产品?
-
09-10-2019 - |
题
我收到例外
无法将[java.lang.string]类型的属性值转换为属性产品所需的[beans.product];嵌套异常是java.lang.illegalargumentException:无法将[java.lang.string]类型的值转换为属性产品所需的类型[beans.product]:未找到匹配的编辑或转换策略
在错误的错误对象中,甚至在我的详细信息效率值开始通过validate方法开始验证。
我不明白为什么春天这样做。我没有直接映射到产品属性/对象的任何输入字段。我只是在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>
详细信息ProfoductFormController的背词对象是:
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
}
如果您需要其他信息,我将提供。我正在使用春季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 (由于雅各布的要求):这是我的验证者:
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.");
}
}
}
当我到达线时 详细信息backbackingObject详细信息productuctingObject = 我已经有错误。
请求参数转换为备份对象属性发生在 http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/basecommandcontroller.html 。这就是Spring关于转换的说法:
使用请求参数和属性材料填充:收到请求后,任何BaseCommandController都将尝试使用请求参数填充命令对象。这是使用典型且著名的Javabeans属性符号完成的。当存在一个名为“ firstName”的请求参数时,该框架将尝试调用SetFirstName([value])传递参数的值。嵌套属性当然得到支持。例如,一个名为“地址。
重要的是要意识到您不仅限于Javabeans中的字符串论点。使用java.beans软件包提供的属性编号通知,您将能够将字符串转换为对象,另一方面。例如,只要您在控制器中注册适当的属性编码器,就可以完全使用命名为EN值的请求参数(locale loc)(locale loc)(locale loc)(请参阅Initbinder()有关此问题的更多信息,请参见Initbinder()。
验证器:在控制器成功填充了来自请求的参数的命令对象之后,它将使用任何配置的验证器来验证对象。验证结果将放在错误对象中,该对象可以在视图中用于呈现任何输入问题。
解决方案
由于我看不到该表格的任何错误,所以我能想象的唯一可能的原因是您有一个名称的参数 product
在您的表单页面的URL中。
如果是这样,您可以更改URL或使用 DataBinder.setDisallowedFields()
禁用尝试绑定该参数的尝试。