我正在尝试创建一个简单的视图解析器,无论您想要什么视图(作为起点),都会返回hello world。
到目前为止,我有这个:
public class MyViewResolver extends AbstractTemplateView {
@Override
protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
doRender(model, request, response);
}
protected void doRender(Map<String,Object> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
PrintWriter writer = response.getWriter();
writer.write("hi from my resolver!");
}
}
现在我收到了这个错误:
2012-03-29 16:51:28.855:WARN:/:unavailable
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'viewResolver' defined in ServletContext resource [/WEB-INF/application-context.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'url' is required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
我已经实现了所需的AbstractTemplateView,不确定它要求的url属性是什么?
此外,传递给此viewresolver的视图的名称在哪里?
更新
所以我补充道:
@Override
public boolean isUrlRequired() {
return false;
}
现在我只是得到一个错误:
HTTP ERROR 404
Problem accessing /home/index. Reason:
NOT_FOUND
我的application-context.xml包含:
<bean id="viewResolver" class="com.example.MyViewResolver">
</bean>
我错过了什么?
答案 0 :(得分:7)
您扩展(间接)AbstractUrlBasedViewResolver
,因此解析视图需要URL才合乎逻辑。但是,如果您不需要,则可以覆盖isUrlRequired()
方法并返回false
答案 1 :(得分:3)
您的错误开始了:您正在实施ViewResolver
而不是View
。在这里看到Spring的documentation,你可以从很多基类开始。至于视图名称,一旦你走上正确的轨道就会非常明显,因为方法View resolveViewName(String viewName, Locale locale)
是ViewResolver
接口中唯一的方法。
但是,从你对这些概念的混淆来判断,也许你真正的问题是“帮助我在Spring MVC中创建一个Hello World”。在这种情况下,我应该真正引导您使用Spring MVC发行版附带的示例,但这是一个快速入门的东西。首先,您不需要实现ViewResolver
甚至View
。您需要的最基本的东西是Controller
,它可以直接产生响应:
public class MyController implements Controller
{
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response)
{
response.getWriter().println("Hello, world!");
return null;
}
}
接下来,您需要一个HandlerMapping,这是最简单的变体:
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
最后,声明您的控制器并将其名称设置为您希望它提供的URL:
<bean name="/home/index" class="MyController" />
答案 2 :(得分:2)
你在Spring MVC中混淆了两个概念。在Spring MVC中,您既需要视图解析器,也需要视图。
在你的问题中你想要两件事:
创建视图: 扩展:org.springframework.web.servlet.View 然后,您的实现可以将“hello world”写入http响应。
创建视图解析器: 扩展:org.springframework.web.servlet.ViewResolver 您的实现应始终返回先前创建的视图。
您可以看到viewresolver基类是您已获得返回视图名称的位置。请参阅:https://fisheye.springsource.org/browse/spring-framework/spring-webmvc/src/main/java/org/springframework/web/servlet/ViewResolver.java
这是回答问题的最基本方式。 Spring为这些类提供了许多实现,以满足您的用例。
希望这会有所帮助。如果您需要更多详细信息,请与我们联系。
答案 3 :(得分:1)
如果你深入了解嵌套异常,你会看到
Caused by: java.lang.IllegalArgumentException: Property 'url' is required
at org.springframework.web.servlet.view.AbstractUrlBasedView.afterPropertiesSet(AbstractUrlBasedView.java:67)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$6.run(AbstractAutowireCapableBeanFactory.java:1504)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1502)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 37 more
Exception出现在AbstractUrlBasedView.java:第67行,如果你看到弹簧源文件@fisheye.springsource.com,你会发现以下代码
public void afterPropertiesSet()抛出Exception { if(isUrlRequired()&amp;&amp; getUrl()== null){ 抛出新的IllegalArgumentException(“属性'url'是必需的”); } }
/**
* Return whether the 'url' property is required.
* <p>The default implementation returns <code>true</code.
* This can be overridden in subclasses.
*/
protected boolean isUrlRequired() {
return true;
}
所以检查如果是isUrlRequired并且getURL为null 它将显示上述异常,因此通过将isUrlRequired更改为false可以避免第一个异常