在Spring MVC中创建自定义视图解析器:属性'url'是必需的

时间:2012-03-29 20:58:28

标签: java spring spring-mvc

我正在尝试创建一个简单的视图解析器,无论您想要什么视图(作为起点),都会返回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>

我错过了什么?

4 个答案:

答案 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中,您既需要视图解析器,也需要视图。

在你的问题中你想要两件事:

  • 返回“hello world”的视图。
  • 传递所有内容的视图解析器 将视图名称返回到上面的视图。

创建视图: 扩展: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可以避免第一个异常