Скорость + Весна - PullRequest
       20

Скорость + Весна

4 голосов
/ 17 февраля 2011

Я пытаюсь настроить веб-приложение с указанными выше компонентами.Я перепрыгнул все, кроме последнего препятствия, которое заключается в интеграции Spring & Velocity Tools.Я видел этот пост этим утром и обновил его с немного отличным ответом, чем было предоставлено.Тем не менее, как только я попытался добавить ParameterTool в один из моих шаблонов, например, так:

#foreach( $key in $params.keySet() )
    $key = $params.getValue($key)
<br />
#end

Я получаю NPE java.lang.UnsupportedOperationException: Запрос равен нулюParameterTool должен быть инициализирован первым!Согласно тому, что я прочитал, это означает, что инструмент был настроен правильно, просто у него нет доступа к запросу.Примечание: я получаю сообщение об ошибке с принятым решением.

Кто-нибудь успешно смог использовать эти инструменты с Spring?Кажется, это известный недостаток, так как есть Open Jira для этого Open Jira SPR-5514

1 Ответ

2 голосов
/ 21 февраля 2011

Немного измененная версия Принятый ответ из этот вопрос решает эту проблему.

Вместо того, чтобы возвращать ViewContext, вам нужно вернуть ViewToolContext. Вам также нужно будет подготовить наборы инструментов и настроить их для сеанса / запроса в зависимости от обстоятельств:

Вам нужно будет инициализировать toolContext в зависимости от того, что вам нужно (посмотрите мой предоставленный ответ здесь о том, как это сделать с обновленными API, поскольку вам потребуется доступ к ToolboxFactory.

Модифицированному методу createVelocityContext теперь необходимо подготовить наборы инструментов перед созданием ViewToolContext следующим образом:

protected Context createVelocityContext(Map <String, Object> model, 
                                        HttpServletRequest request,
                                        HttpServletRespsone response) 
                                        throws Exception {

    initVelocityContext();  //Still keep toolContext static
                            //will need to also add this to 
                            //the servletContext -- left as an exercise
    prepareToolboxes(request, response);
    Context context = 
        new ViewToolContext(getVelocityEngine(), request, 
                                response, getServletContext());
    //Set model attrs to context
    ....
    return context;
}

private void prepareToolboxes(final HttpServletRequest request, 
                              final HttpServletResponse response) {
    String key = Toolbox.class.getName();
    if (factory.hasTools(Scope.REQUEST && request.getAttribute(key) == null) {
        Toolbox requestTools = factory.createToolbox(Scope.REQUEST);
        request.setAttribute(key, requestTools);
    }
    if (factory.hasTools(Scope.SESSION) {
       HttpSession session = request.getSession();
       synchronized(factory) {
           //Follow pattern from above
       }
    }
}
...