错误:Spring 3.0.3 MVC Portlet + JSON的“ ContentNegotiatingViewResolver”
问题内容:
我想使用具有JSON支持的DispatcherPortlet类来制作spring MVC 3.0.3
portlet。因此,我在spring上下文文件中添加了以下配置。
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
文字/ HTML
没有这个,如果我仅使用“
InternalResourceViewResolver”,那么它将运行良好,并且我能够使用Portlet。但是在定义了这个bean的情况下,tomcat启动时出现了以下错误。
我四处搜寻,并找到一个链接,指出该带有JSON的bean仅在最新的spring版本中适用于servlet。请同时检查链接。
http://jira.springframework.org/browse/SPR-7344(portlet的
JSON问题…)
http://jira.springframework.org/browse/SPR-6932?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-
tabpanel#issue-
tabs
另外,请检查下面粘贴的错误。帮帮我…谢谢。
:错误:
java.lang.IllegalArgumentException: Object of class [org.springframework.web.portlet.context.PortletRequestAttributes] must be an instance of class org.springframework.web.context.request.ServletRequestAttributes
请检查日志
Caused by: java.lang.IllegalArgumentException: Object of class [org.springframework.web.portlet.context.PortletRequestAttributes] must be an instance of class org.springframework.web.context.request.ServletRequestAttributes
at org.springframework.util.Assert.isInstanceOf(Assert.java:337)
at org.springframework.util.Assert.isInstanceOf(Assert.java:319)
at org.springframework.web.servlet.view.ContentNegotiatingViewResolver.resolveViewName(ContentNegotiatingViewResolver.java:363)
at org.springframework.web.portlet.DispatcherPortlet.resolveViewName(DispatcherPortlet.java:1110)
at org.springframework.web.portlet.DispatcherPortlet.render(DispatcherPortlet.java:1052)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:761)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:522)
问题答案:
ContentNegotiatingViewResolver
不适用于portlet,仅适用于servlet。
通常,Spring中的许多Servlet API类都具有等效的Portlet,例如
- org.springframework.web。 servlet .HandlerAdapter
- org.springframework.web。 portlet .HandlerAdapter
您必须确保使用正确的-servlet和portlet API完全不兼容。
但是,从Spring 2.5开始,Portlet框架已被忽略(可能是因为它很少使用),并且Servlet MVC API的较新部分尚未包含在Portlet
MVC API中。
看来,如果您想做自己想做的事情,就必须自己做很多事情。您也许可以从ContentNegotiatingViewResolver
和相关类中复制一些代码。