Создание настраиваемого преобразователя представления в Spring MVC: требуется свойство 'url' - PullRequest
5 голосов
/ 30 марта 2012

Я пытаюсь создать простой распознаватель представлений, который возвращает привет мир независимо от того, какое представление вы хотите (в качестве отправной точки).

У меня пока есть это:

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 ]

7 голосов
/ 30 марта 2012

Вы расширяете (косвенно) AbstractUrlBasedViewResolver, поэтому логично, что для разрешения представления требуется URL.Однако, если в вашем случае это не требуется, вы можете переопределить метод isUrlRequired() и вернуть false

3 голосов
/ 08 апреля 2012

Вы ошиблись: вместо ViewResolver вы реализуете View. См. документацию Spring об этом, есть много базовых классов, с которых вы можете начать. Что касается имени представления, оно станет совершенно очевидным, как только вы попадете на правильный путь, поскольку метод View resolveViewName(String viewName, Locale locale) является единственным в интерфейсе ViewResolver.

Но, судя по вашей путанице с этими понятиями, возможно, ваш реальный вопрос - «помогите мне создать Hello World in Spring MVC». В этом случае я действительно должен направить вас к примерам, поставляемым с дистрибутивом 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 голосов
/ 09 апреля 2012

Вы перепутали две концепции в Spring MVC. В Spring MVC вам нужны и средство разрешения, и представление.

В своем вопросе вы хотите две вещи:

  • Представление, которое возвращает "привет мир".
  • Средство разрешения, которое передает все возвращенные имена представлений в представлении выше.

Чтобы создать представление : Расширить: org.springframework.web.servlet.View Ваша реализация может затем написать «привет мир» в ответ 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 предлагает множество реализаций этих классов для более специализированных целей, которые могут удовлетворить ваш вариант использования.

Надеюсь, это поможет. Дайте мне знать, если вам нужно больше деталей.

1 голос
/ 06 апреля 2012

Если вы покопаетесь во вложенном исключении, вы увидите

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 () создает исключение { if (isUrlRequired () && 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, вы можете избежать 1-го исключения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...