0

フォームからフォーム スニペットに Bean をバインドしようとしています。

[#ftl/]
[#import "spring.ftl" as spring /]
[#import "panda.ftl" as panda /]

[#import "discoveryProject.ftl" as discoveryProject/]
[#macro defineProjectForm newProject]
[@spring.bind "discoveryProjectDetailsBean"/]

[#if newProject?has_content && newProject =="true"]
<table class="transparentTable">
    <tr>
        <!--Left Part-->
        <td>
            <table>
                <tr>
                    <td>
                        [@spring.showErrors " " "errors"/]
                        <span>Data Source<sup><span style="color: red; ">*</span></sup></span>
                    </td>
                    <td>
                        <select id="dataSourceSelect" onchange="checkSelectChanges()">
                            [#if discoveryProjectLookupBean.dataSources?has_content]
                                [#list discoveryProjectLookupBean.dataSources as dataSource]
                                    <option id="${dataSource.id}" value="${dataSource.name}">${dataSource.name}</option>
                                [/#list]
                            [/#if]
                        </select>
                    [@spring.bind path="discoveryProjectDetailsBean.discoveryProjectBean.dataSource"/]
                    </td>
                </tr>
            </table>

これはコントローラーに送信され、スニペットはこのコントローラーに送信されます。

@RequestMapping("/navigateDiscoveryProject")
ModelAndView navigateDiscoveryProject(@RequestParam("index")String i,@RequestParam("direction")String direction,
        @ModelAttribute("discoveryProjectDetailsBean")DiscoveryProjectDetailsBean discoveryProjectDetailsBean,BindingResult result,HttpSession session)throws Exception{
    logger.info("method invoked");
    int index=Integer.parseInt(i);
    //another code
}

Beanには、discoveryProjectDetailsBean実際には別の Bean であるプロパティが含まれています。discoveryProjectBeanこの Bean のプロパティは常に null ですが、上記の dataSource プロパティの例のように、ftl で自分自身をバインドします。プロパティのすべての値discoveryProjectBeanは常に null です。

4

1 に答える 1

0

私の問題に対する2つの答えを見つけました。最初の方法は、各プロパティを単独でバインドすることです。各プロパティを特定のコントローラーにバインドする必要があるのに、コマンド オブジェクトのみをバインドしていたことを確認してください。このような

[#ftl/]
[#import "spring.ftl" as spring /]
[#import "panda.ftl" as panda /]

[#import "discoveryProject.ftl" as discoveryProject/]
[#macro defineProjectForm newProject]
// this is useless [@spring.bind "discoveryProjectDetailsBean"/]

[#if newProject?has_content && newProject =="true"]
<table class="transparentTable">
    <tr>
        <!--Left Part-->
        <td>
            <table>
                <tr>
                    <td>
                        [@spring.showErrors " " "errors"/]
                        <span>Data Source<sup><span style="color: red; ">*</span></sup></span>
                    </td>
                    <td>
                        <select id="discoveryProjectBean.dataSource" name="discoveryProjectBean.dataSource" onchange="checkSelectChanges()">
                            [#if discoveryProjectLookupBean.dataSources?has_content]
                                [#list discoveryProjectLookupBean.dataSources as dataSource]
                                    <option id="${dataSource.id}" value="${dataSource.name}">${dataSource.name}</option>
                                [/#list]
                            [/#if]
                        </select>
//the following binding work just fine
                        [@spring.bind path="discoveryProjectDetailsBean.discoveryProjectBean.dataSource"/]
                    </td>
                </tr>
            </table>

上記で行ったことは、コマンド オブジェクトから必要なプロパティを取得し、select タグの名前と ID として設定し、 を使用してタグをプロパティにバインドしたこと@spring.bindです。

これが最善の解決策です

別の方法は、次のようにすることです。

[#ftl/]
[#import "spring.ftl" as spring /]
[#import "panda.ftl" as panda /]

[#import "discoveryProject.ftl" as discoveryProject/]
[#macro defineProjectForm newProject]
[@spring.bind "discoveryProjectDetailsBean"/]

[#if newProject?has_content && newProject =="true"]
<table class="transparentTable">
    <tr>
        <!--Left Part-->
        <td>
            <table>
                <tr>
                    <td>
                        [@spring.showErrors " " "errors"/]
                        <span>Data Source<sup><span style="color: red; ">*</span></sup></span>
                    </td>
                    <td>
                        [@spring.bind "dataSources"/]
                [@spring.formSingleSelect "discoveryProjectDetailsBean.discoveryProjectBean.dataSource" dataSources "disabled='disabled' multiple='multiple' class='singleList' onchange='checkValidations()'" /]

                    </td>
                </tr>
            </table>

いいえ、これによりコーディングは少なくなりますが、選択タグのオプションのリストに制限があります。@spring.formSingleSelectこれをバインドする文字列のリストを取得することを参照してくださいdataSources。 freemarker.template.TemplateException: の freemarker 例外。これが誰かに役立つことを願っています

于 2012-11-19T16:11:28.263 に答える