2012-03-29 42 views
5

我試圖創建一個簡單的視圖解析器,無論您想要什麼視圖(作爲起點),都會返回hello world。在Spring MVC中創建自定義視圖解析器:屬性'url'是必需的

我有這個至今:

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) 

我已經實現的任何要求,不知道它叫什麼url屬性爲AbstractTemplateView?

此外,傳遞給此viewresolver的視圖的名稱在哪裏?

更新

於是我說:

@Override 
    public boolean isUrlRequired() { 
     return false; 
    } 

而現在我只是得到一個錯誤,如:

HTTP ERROR 404 

Problem accessing /home/index. Reason: 

    NOT_FOUND 

我的應用程序的context.xml有:

<bean id="viewResolver" class="com.example.MyViewResolver"> 

</bean> 

我在想什麼?

+0

開始 - 爲什麼你需要一個新的解析器。然後,您應該只需放置一個斷點並追蹤到底發生了什麼以及NOT_​​FOUND從哪裏返回。這就是我的調試意思。 – Bozho 2012-04-07 10:57:29

回答

7

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

+0

爲什麼它編譯,然後如果我沒有實現它?或者它拋出一個異常,我必須重寫該異常? – Blankman 2012-03-29 21:10:30

+0

它正在編譯,因爲它有一個返回'true'的默認實現。並在運行時檢查屬性 – Bozho 2012-03-29 21:12:34

+0

我看到了,請參閱我的更新。現在得到404? – Blankman 2012-03-29 21:17:20

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 

所以異常來得AbstractUrlBasedView.java:行67,如果你看到春源文件@fisheye.springsource.com你會發現下面的代碼

公共無效的afterPropertiesSet()如果拋出異常{ (isUrlRequired()& &的getURL()== NULL){ 拋出新的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爲空,它會顯示上述異常,因此通過改變isUrlRequired假就可避免一號例外

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

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

在你的問題,你想兩件事情:

  • 返回的 「Hello World」 的視圖。
  • 將所有 返回的視圖名稱傳遞給上述視圖的視圖解析器。

創建視圖: 擴展:然後org.springframework.web.servlet.View 您的實現可以寫 「Hello World」 的HTTP響應。

要創建的視圖解析: 擴展:org.springframework.web.servlet.ViewResolver 你的實現應該總是TE返回先前創建的視圖。

您可以看到,viewresolver基類是您接受返回的視圖名稱的地方。請參閱:https://fisheye.springsource.org/browse/spring-framework/spring-webmvc/src/main/java/org/springframework/web/servlet/ViewResolver.java

這是回答您的問題最基本的方法。 Spring爲這些類提供了許多實現,以用於更適合您的用例的專門用途。

希望這會有所幫助。讓我知道你是否需要更多細節。