[英]Spring MVC AJAX and JSON using Custom View Resolver, and Custom View
[英]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中,您既需要視圖解析器,也需要視圖。
在你的問題中你想要兩件事:
要創建視圖 :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.