我将模型中的数据设置为:
@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);
}
这里我需要检查模型是否为SoyMapData
类型,如果是,则将模型类型设置为SoyMapData
else map。
我怎么能这样做?
我尝试过以下方法无效。
答案 0 :(得分: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
关于model
是否为SoyDataModel
。 (例如,它是一个重载方法,你希望编译器知道要使用哪一个。)如果是这样,那么你只需使用我给你的信息,如下所示:
@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
);
}
}
答案 1 :(得分:0)
您无法在Java中更改变量/参数的类型。您可以检查对象的类型,如果它符合您的条件,则按如下所示创建新类型的另一个变量
if (model instanceof SoyMapData) {
SoyMapData soyModel = (SoyMapData)model;
...
}
答案 2 :(得分:0)
修改:SoyMapData
位于model
的{{1}}内。如果renderMethod1
中的参数model
引用同一个对象(然后renderMergedTemplateModel
需要实现接口Model
),则需要获取密钥Map
处的对象
如果上述假设成立,
pageTitles
应该有用。
if (model.get("pageTitles") instanceof SoyMapData) {
SoyMapData sModel = (SoyMapData)model.get("pageTitles");
}
用于检查实例的运行时类型:
instanceof