其他分享
首页 > 其他分享> > 为什么总是被如此低级的错误绊倒:Cannot expose request attribute 'alias' because of an existing model objec

为什么总是被如此低级的错误绊倒:Cannot expose request attribute 'alias' because of an existing model objec

作者:互联网

和平常一样,写了控制器,然后又完成了FreeMarker页面的设计,重新启动SpringBoot应用等待期望的页面显示。然而却出现了404。

HTTP Status 404 – Not Found

查看后台日志输出的错误信息,没有能够定位到自己源代码的提示,提示信息给出的内容是:

Cannot expose request attribute 'alias' because of an existing model object of the same name

于是开始了解决问题的恼人过程:

第一步,先在源代码中查找是不是重复注入了alias属性,毕竟这个问题以前曾经发生过,只不过属性名不是alias。经过仔细排查根本没有找到提示信息指出的重复暴露的问题,自己解决不了,开始第二步上网查找问题的解决方案,将上述错误信息放入百度搜索。

第二步,网上给出问题的答案

找到了一些线索,都是指向重复暴露属性的情况,这种问题的解决办法要不就是改名防止同名暴露冲突,还有就是修改SpringBoot应用中的FreeMarker配置属性:

freemarker:
    charset: UTF-8
    content-type: text/html; charset=utf-8
    expose-request-attributes: true
    expose-session-attributes: true      #将session的属性暴露出来给后台
    expose-spring-macro-helpers: true    #暴露freemarker的宏定义
    suffix: .ftl    #设置freemarker的后缀
    allow-session-override: true   #设置允许session被重写
    allow-request-override: true    #设置允许request被重写

貌似通过修改属性的值可以解决这个问题,但我总是觉得我的问题并不属性这种情况,因为在第一步中我没有发现代码中有重复暴露的情况出现,于是继续寻找......

终于在某个网文中发现了这个说法:

freemarker 异常:Cannot expose request attribute 'request' because of an existing 我出现这个问题的原因是FreeMarker配置文件宏定义页面出现了一个小小的空格,造成整个系统的崩溃.让人很不爽啊。

于是我再次调试和查看自己的代码,突然发现在我的控制器转发到FreeMarker视图的return语句是这样编写的:

template = "/content/page-show.ftl";
...

return template;

返回的视图由于在配置中已经默认设置了扩展名(上面属性配置中的后缀设置suffix: .ftl),因此在返回视图时是不需要指定FreeMarker文件的扩展名,难道是这个问题?在我的印象里依稀记得好像很久之前出现过指定文件扩展名程序出现过错误的情况,但错误信息是不是重复暴露属性这种情况却不记得了(好像有点相似),于是将FreeMarker视图文件扩展名去掉,重新启动程序,再次访问页面不出现404错误了,同时后台也不出现Cannot expose request attribute这类错误信息了。

真是无语了,现在编程经常被这样的经常发生的低级错误中断,花费了许多时间来解决这种问题,太不值得了,写这个随想记录一下,希望以后不再犯类似的错误,即使出现了类似的错误,看看这篇文章兴许可以快速的找到答案。

标签:because,name,FreeMarker,attribute,expose,request,视图,true,属性
来源: https://www.cnblogs.com/xupeixuan/p/15754341.html