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 映射。我怎样才能做到这一点?

我试过下面的方法它不起作用。

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它接收的是哪种类型,这会破坏封装。

有很多方法可以解决这个问题。Map一种是从允许完成其工作的新接口派生render,然后使用该接口而不是Map在方法签名中。但这只是一种方式。


更新:更新您的代码,如果我理解正确,您想compiledSoyTemplates.render使用SoyDataModel参数或参数调用,Map具体取决于. (例如,它是一个重载方法,您希望编译器知道要使用哪一个。)如果是这样,那么您只需使用我在上面给您的信息,如下所示:modelSoyDataModel

@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里面modelrenderMethod1如果modelin 中的参数renderMergedTemplateModel引用同一个对象(然后Model需要实现接口Map),则需要在 key 处获取对象pageTitles

如果上述假设成立,

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 回答