function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
pikotaropikotaro 

<apex:inputText> 要素の値は、文字列型として解決する必要があります。

VFページで、<apex:commandButton>でできた保存ボタンをクリックした後、
<apex:pageMessage>に以下が出力されてしまい保存ができません。

「<apex:inputText> 要素の値は、文字列型として解決する必要があります。」

おそらく、あるケースで、ページの一部の項目が、<apex:inputText disabled="true">となるケースがあり、
その時に発生していそうなので(disabled指定が無い場合は保存できます)
保存ボタンクリック時に、disabledを解除するjsをいれましたが、変わらず同じエラーになりました。

原因がわからず困っていますが、なにが原因と考えられますでしょうか。
Taiki YoshikawaTaiki Yoshikawa
エラーが再現するシンプルなサンプルコードを共有頂ければ調査できるかもしれません。基本的に今までdisabledの有無でエラーが発生することは無かったので原因は他にありそうな気がします。(disabledが原因の場合でも保存時にJSでdisabledを解除するといった複雑な対応を行わなくても何か回避策がありそうです。)
pikotaropikotaro
お返事ありがとうございます_(_ _)_

私の環境では、再現できるのですが、再現環境を作ろうとするとそれができず。。

原因と思われる部分は、◯◯の項目が◯◯になったときで、かつ、
◯◯とは違う別の項目をVFで編集しようとした時に発生するようです。

なにがエラー原因かわからず、debugLogのvisualforceをFINESTにしたりしていますが、
「要素の値は、文字列型として解決する必要があります。」とは表示されますが、エラーの原因は出力されてきません。。
または、BEGIN/END・・・BEGIN/ENDとログに表示されていて、当該文言がでる部分のVF行をみても、なんら問題ありそうにはみえません。

00:11:15.0 (26987216)|VF_EVALUATE_FORMULA_BEGIN|066N00000002J42|#{introWrap.constructionStatus==$Label.NonSending}
00:11:15.0 (27007954)|VF_EVALUATE_FORMULA_END
00:11:15.0 (27452001)|VF_PAGE_MESSAGE|<apex:inputText> 要素の値は、文字列型として解決する必要があります。
00:11:15.0 (27490444)|VF_EVALUATE_FORMULA_BEGIN|066N00000002J42|#{lockedMessage != null}
00:11:15.0 (27509128)|VF_EVALUATE_FORMULA_END

かなり、お手上げなのですが、なにか考えられる原因ありますでしょうか。。

もう、作り直しをして、しかもJSからの更新方式などに変える感じでしょうか。。
Taiki YoshikawaTaiki Yoshikawa
そうですか。。ちょっと考えられそうな原因に心当たりはありませんでした。
pikotaropikotaro
なるほど。。
ちなみに、2画面から同一レコードに対して、SF標準ページからとVFページから更新かけた際、
SF標準ページでは、同時更新が合った場合ページにメッセージが表示されますが、
VFにも楽観ロックの仕組みをいれまして、同時更新をキャッチしたのでApexpages.addMesssageしてreturn null;すると、VF側でエラーがでてしまうという謎の現象もでています。
同時更新でなければ、return nullしてもエラーにはならないのですが。
ということは、同時更新があった場合、SF側でなんらかキャッチしてVFに伝えてExceptionページになるといった機構が入っているように思えましたが、そういう感じになっているかどうかご存知でしょうか。
Taiki YoshikawaTaiki Yoshikawa
DmlExceptionのエラーなどではなく、Apexpages.addMesssageしてreturn null;するとエラーになるということでしょうか。
そちらも私の方ではあまり聞いたことがないエラーですね。
ちなみにエラーのメッセージは共有頂くことは可能でしょうか。
pikotaropikotaro
ありがとうございます。

はい、DmlExceptionのエラーなどではなく、Apexpages.addMesssageしてreturn null;すると、エラーになります。

処理フローは、以下になるのですが、

(1)入力値チェック
 正常:(2)へ
 異常:Apexpages.addMesssageしてreturn null;
(2)ビジネスロジックチェック(同時更新のチェックもしています。)
 正常:(3)へ
 異常:Apexpages.addMesssageしてreturn null;
(3)保存


入力値チェック異常があった場合のApexpages.addMesssageしてreturn null;するのですが、そこではエラーになりません。
一方で、同時更新がみつかった場合Apexpages.addMesssageしてreturn null;した場合はエラーになるという不可解な挙動です。

エラーメッセージについては、なにもでておらず、
ログをみますと、例外がいっさいthrowされておらずそのログがおわった直後、
いきなりExceptionページへ遷移されている結果となっております。


ただ、スミマセン。↑の状況も何回か見受けられたのですが、現在は、当初の
「<apex:inputText> 要素の値は、文字列型として解決する必要があります。」
となります。


12:46:01.0 (22738811)|VF_EVALUATE_FORMULA_BEGIN|066N00000002J42|#{lockedMessage != null}
12:46:01.0 (22749801)|VF_EVALUATE_FORMULA_END
12:46:01.0 (22981828)|VF_PAGE_MESSAGE|<apex:inputText> 要素の値は、文字列型として解決する必要があります。
12:46:01.0 (22995646)|VF_EVALUATE_FORMULA_BEGIN|066N00000002J42|#{lockedMessage != null}
12:46:01.0 (23012582)|VF_EVALUATE_FORMULA_END
 
pikotaropikotaro
複雑なコードで申し訳ございませんが、
「<apex:inputText> 要素の値は、文字列型として解決する必要があります。」
上記メッセージが発生するのは、以下の部分のようでして、
以下をコメントアウトすると保存ができます。
<tr>
                                <th scope="row">金額1</th>
                                <td>
                                    <div class="mainSideFixedColumnLayout">
                                        <div class="main">
                                            <apex:inputText disabled="{!OR(NOT(isEditable), isLockedByContract)}"
                                                            value="{!introWrap.intro.price1__c}"
                                                            styleClass="digit-break {!IF(AND(isEditable, introWrap.contractsFixedDate != null, hasInputErrorMap['price1__c']), 'input-required', '')}"
                                                            style="width: 97%;"
                                                            html-data-pattern="/^\d*$/"
                                                            html-data-pattern-message="金額の入力形式が正しくありません。半角数値でご入力ください。"/>&nbsp;円
                                        </div>
                                        <apex:outputPanel rendered="{!lockedMessage != null}" styleClass="side">
                                            <span class="doneContract" title="{!lockedMessage}">
                                                <i class="fa fa-lock fa-lg fa-fw faKey" aria-hidden="true"></i>
                                            </span>
                                        </apex:outputPanel>
                                    </div>
                                </td>
                            </tr>
                            <tr>
                                <th scope="row">金額2</th>
                                <td>
                                    <apex:inputText disabled="{!NOT(isEditable)}"
                                                    value="{!introWrap.intro.price2__c}"
                                                    styleClass="digit-break contractsPriceFixed {!IF(AND(isEditable, hasInputErrorMap['price2__c']), 'input-required', '')}"
                                                    style="width: 97%;"
                                                    html-data-pattern="/^\d*$/"
                                                    html-data-pattern-message="金額の入力形式が正しくありません。半角数値でご入力ください。"/>&nbsp;円
                                </td>
                            </tr>



 
pikotaropikotaro
原因はわからないのですが、inputTextではなく、inputFieldをつかい、disabled属性についてはoutputPanelのrenderで解決できるので、その方向で対応ができそうなので、今回は、その方向で進めようと思います。

ご多忙の折考えていただきまして誠に感謝します!!
ありがとうございました!
Taiki YoshikawaTaiki Yoshikawa
コードありがとうございます。特に問題点は無さそうですね。もしかしてと思った部分でdesabledの部分が変数になっているのが原因とかoutputPanelとの組み合わせでエラーになるかとか試してみたのですが、特に再現もしませんでした。
<apex:page standardController="Opportunity">
    <apex:form id="form">
        <apex:pageBlock id="block">
            <apex:pageBlockButtons location="bottom">
		    	<apex:commandButton value="Save" reRender="form" />
            </apex:pageBlockButtons>
            <apex:outputPanel rendered="{!Opportunity.Id == null}">
                <apex:pageBlockSection>
                    <apex:inputText value="{!Opportunity.Name}" />
                    <apex:inputField value="{!Opportunity.AccountId}" />
                    <apex:inputText value="{!Opportunity.Amount}" 
                          disabled="{!And(Opportunity.Name != null, Opportunity.AccountId != null)}" />
                </apex:pageBlockSection>
            </apex:outputPanel>
        </apex:pageBlock>
    </apex:form>
</apex:page>

解決はしませんでしたが少し類似のエラー情報が無いか検索してみたところ、下記情報を見つけました。
https://developer.salesforce.com/forums/?id=906F000000095ugIAA

何か特定の条件で発生するエラーではあるようでした。
inputFieldをつかったやり方に変更して解決したとのことよかったです。
pikotaropikotaro
ありがとうございました!
なるほど。英語サイトで似た情報があったのですね。