1

モデルのデータを次のように設定しています。

@RequestMapping("/forms/builder/")
public void renderMethod1(Model model) {            
    SoyMapData x=new SoyMapData("class","menu horizontal right");
    model.addAttribute("pageTitles", x);        
}

Spring を介して以下の関数にマップされます。

@Override
protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
    String renderedResponse = null;
    renderedResponse = compiledSoyTemplates.render(templateName, model, messageBundle);
}

ここで、モデルが type かどうかを確認する必要があります。SoyMapDataそうであれば、モデルのタイプをSoyMapDataelse map に設定します。これどうやってするの?

以下のアプローチを試してみましたが、うまくいきません。

4

3 に答える 3

4

演算子でそれを行うことができますinstanceof

SoyMapData soyModel;
if (model instanceof SoyMapData) {
    // It is, get a reference using that type
    soyModel = (SoyMapData)model;
}

...しかし、それを行う必要がある場合は、API 設計のカプセル化に問題があることを示唆しています。メソッドは、カプセル化を破る、renderどのような種類のメソッドを受け取っているかを知る必要はありません。Map

それを解決する方法はたくさんあります。Map1 つは、ジョブを実行できるようにする新しいインターフェイスを派生させ、メソッド シグネチャではrenderなくそのインターフェイスを使用することです。Mapしかし、それは 1 つの方法にすぎません。


更新:更新されたコードについて、私があなたを正しく理解していれば、引数または引数のいずれcompiledSoyTemplates.renderかで呼び出す必要があります。(たとえば、それはオーバーロードされたメソッドであり、コンパイラにどれを使用するかを知らせたい場合。) もしそうなら、私が上で提供した情報を次のように使用するだけです:SoyDataModelMapmodelSoyDataModel

@Override
protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
        String renderedResponse = null;
        if (model instanceof SoyDataModel) {
            renderedResponse = compiledSoyTemplates.render(
                templateName,
                (SoyDataModel)model,
                messageBundle
            );
        }
        else {
            renderedResponse = compiledSoyTemplates.render(
                templateName,
                model,
                messageBundle
            );
        }
}
于 2011-10-12T08:28:34.607 に答える
0

Java では変数/パラメータの型を変更できません。オブジェクトのタイプを確認し、条件に一致する場合は、次のように新しいタイプの別の変数を作成します。

if (model instanceof SoyMapData) {
   SoyMapData soyModel = (SoyMapData)model;
   ...
}
于 2011-10-12T08:30:14.043 に答える
0

編集: :の中にSoyMapData配置されます。のパラメーターが同じオブジェクトを参照する場合 (その後、インターフェイスを実装する必要があります)、キーでオブジェクトを取得する必要があります。modelrenderMethod1modelrenderMergedTemplateModelModelMappageTitles

上記の仮定が成り立つ場合、

if (model.get("pageTitles") instanceof SoyMapData) {
  SoyMapData sModel = (SoyMapData)model.get("pageTitles");
}

動作するはずです。

instanceofインスタンスのランタイムタイプをチェックするために使用されます。

if (model instanceof SoyMapData) {
  SoyMapData sData = (SoyMapData)model;
  ...
} else {
  ...
}
于 2011-10-12T08:31:29.050 に答える