springで、springで型文字列の値を必要なタイプ製品に変換できないIllegalargumentexceptionが取得できないのはなぜですか?

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

質問

例外を受け取ります

タイプ[java.lang.string]のプロパティ値を不動産製品に必要なタイプ[beans.product]に変換できませんでした。ネストされた例外はjava.lang.illegalargumentexception:タイプ[java.lang.string]の値を変換することはできませんプロパティ製品に必要なタイプ[beans.product]:マッチングエディターまたは変換戦略が見つかりません

エラーでは、私の詳細前にエラーオブジェクトがオブジェクトであり、検証メソッドを介して検証を開始します。

なぜ春がそうするのかわかりません。製品プロパティ/オブジェクトに直接マッピングされた入力フィールドはありません。 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
}

他の情報が必要な場合は、提供します。スプリング2.5.5を使用しています。

敬具、
専制

編集1 (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>

編集2 (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.");
        }
    }
}

私が線に到達したとき 詳細なproductbackingObject detweerproductbackingObject = すでにエラーがあります。
リクエストパラメーターをバッキングオブジェクトのプロパティに変換することは、 http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/basecommandcontroller.html 。これは、Springが変換について言っていることです。

リクエストパラメーターとプロパティエディターを使用して居住する:リクエストを受信すると、BaseCommandControllerはリクエストパラメーターを使用してコマンドオブジェクトを入力しようとします。これは、典型的でよく知られているJavabeansプロパティ表記を使用して行われます。 「FirstName」という名前の要求パラメーターが存在すると、フレームワークはパラメーターの値を渡すSetFirstName([Value])を呼び出しようとします。ネストされたプロパティはもちろんサポートされています。たとえば、「address.city」という名前のパラメーターは、getaddress()。setCity([value])コマンドクラスの呼び出しになります。

Javabeansの文字列引数に限定されないことを認識することが重要です。 Java.Beansパッケージで提供されるPropertyEditor Notionを使用すると、文字列をオブジェクトに変換することができます。たとえば、setlocale(locale loc)は、コントローラーに適切なプロパティエディターを登録する限り、enの値を持つロケールという名前の要求パラメーターで完全に可能です(その問題に関する詳細については、initbinder()を参照してください。

バリデーター:コントローラーがコマンドオブジェクトにリクエストのパラメーターを正常に入力した後、構成されたバリーターを使用してオブジェクトを検証します。検証結果は、入力の問題をレンダリングするためにビューで使用できるエラーオブジェクトに配置されます。

役に立ちましたか?

解決

フォームに何も問題がないので、私が想像できる唯一の理由は、あなたが名前が付けられたパラメーターを持っていることです product フォームページのURL。

もしそうなら、あなたはあなたのURLを変更したり、使用したりすることができます DataBinder.setDisallowedFields() そのパラメーターをバインドしようとする試みを無効にします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top