簡體   English   中英

在Spring MVC中創建自定義視圖解析器:屬性'url'是必需的

[英]Creating a custom view resolver in Spring MVC: Property 'url' is required

我正在嘗試創建一個簡單的視圖解析器,無論您想要什么視圖(作為起點),它都會返回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>

我錯過了什么?

您(間接)擴展AbstractUrlBasedViewResolver ,因此解析視圖需要URL是合乎邏輯的。 但是,如果在您的情況下不需要,則可以覆蓋isUrlRequired()方法並返回false

你已經開始錯了:你正在實現一個View而不是ViewResolver 有關此內容,請參閱Spring的文檔 ,您可以從許多基類開始。 至於視圖名稱,一旦你進入正確的軌道就會很明顯,因為方法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" />

你在Spring MVC中混淆了兩個概念。 在Spring MVC中,您既需要視圖解析器,也需要視圖。

在你的問題中你想要兩件事:

  • 返回“hello world”的視圖。
  • 一個視圖解析器,它將所有返回的視圖名稱傳遞給上面的視圖。

要創建視圖 :Extend:org.springframework.web.servlet.View然后,您的實現可以將“hello world”寫入http響應。

要創建視圖解析器 :Extend: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為這些類提供了許多實現,以滿足您的用例。

希望這可以幫助。 如果您需要更多詳細信息,請與我們聯系。

如果你深入了解嵌套異常,你會看到

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

所以異常來自AbstractUrlBasedView.java:第67行,如果你看到彈簧源文件@ fisheye.springsource.com,你會發現以下代碼

public void afterPropertiesSet()throws Exception {if(isUrlRequired()&& getUrl()== null){throw new IllegalArgumentException(“property'url'is required”); }}

/**
 * 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可以避免第一個異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM